1 #ifndef __MONO_MONO_STACK_UNWINDING_H__
2 #define __MONO_MONO_STACK_UNWINDING_H__
4 #include <mono/metadata/appdomain.h>
5 #include <mono/metadata/metadata.h>
6 #include <mono/utils/mono-context.h>
9 * Possible frame types returned by the stack walker.
12 /* Normal managed frames */
13 FRAME_TYPE_MANAGED = 0,
14 /* Pseudo frame marking the start of a method invocation done by the soft debugger */
15 FRAME_TYPE_DEBUGGER_INVOKE = 1,
16 /* Frame for transitioning to native code */
17 FRAME_TYPE_MANAGED_TO_NATIVE = 2,
18 FRAME_TYPE_SENTINEL = 3
22 MONO_UNWIND_NONE = 0x0,
23 MONO_UNWIND_LOOKUP_IL_OFFSET = 0x1,
24 MONO_UNWIND_LOOKUP_ACTUAL_METHOD = 0x2,
26 * Store the locations where caller-saved registers are saved on the stack in
27 * frame->reg_locations. The pointer is only valid during the call to the unwind
30 MONO_UNWIND_REG_LOCATIONS = 0x4,
31 MONO_UNWIND_DEFAULT = MONO_UNWIND_LOOKUP_ACTUAL_METHOD,
32 MONO_UNWIND_SIGNAL_SAFE = MONO_UNWIND_NONE,
33 MONO_UNWIND_LOOKUP_ALL = MONO_UNWIND_LOOKUP_IL_OFFSET | MONO_UNWIND_LOOKUP_ACTUAL_METHOD,
37 MonoStackFrameType type;
39 * For FRAME_TYPE_MANAGED, otherwise NULL.
47 * If ji->method is a gshared method, this is the actual method instance.
48 * This is only filled if lookup for actual method was requested (MONO_UNWIND_LOOKUP_ACTUAL_METHOD)
50 MonoMethod *actual_method;
51 /* The domain containing the code executed by this frame */
56 * IL offset of this frame.
57 * Only available if the runtime have debugging enabled (--debug switch) and
58 * il offset resultion was requested (MONO_UNWIND_LOOKUP_IL_OFFSET)
62 /*The next fields are only usefull for the jit*/
64 guint32 unwind_info_len;
67 mgreg_t **reg_locations;
70 /*Index into MonoThreadState::unwind_data. */
72 MONO_UNWIND_DATA_DOMAIN,
74 MONO_UNWIND_DATA_JIT_TLS,
78 * This structs holds all information needed to unwind the stack
83 gpointer unwind_data [3]; /*right now: domain, lmf and jit_tls*/
85 } MonoThreadUnwindState;