1 #ifndef __MONO_JIT_DEBUG_H__
2 #define __MONO_JIT_DEBUG_H__
6 #include <mono/metadata/debug-helpers.h>
7 #include <mono/metadata/debug-mono-symfile.h>
8 #include <mono/metadata/loader.h>
9 #include <mono/jit/jit.h>
11 typedef struct _MonoDebugHandle MonoDebugHandle;
12 typedef struct _MonoDebuggerInfo MonoDebuggerInfo;
13 typedef struct _MonoDebuggerSymbolFileTable MonoDebuggerSymbolFileTable;
14 typedef struct _MonoDebuggerBreakpointInfo MonoDebuggerBreakpointInfo;
17 MONO_DEBUG_FORMAT_NONE,
18 MONO_DEBUG_FORMAT_STABS,
19 MONO_DEBUG_FORMAT_DWARF2,
20 MONO_DEBUG_FORMAT_MONO
23 extern MonoDebugFormat mono_debug_format;
26 * This variable is intended to be set in a debugger.
28 * If it's non-zero, arch_compile_method() will insert a breakpoint next time
29 * it compiles a method.
31 * If it's positive, it acts as a counter which is decremented each time it's
32 * used. Set it to a negative value to make arch_compile_method() insert a
33 * breakpoint for each method.
35 * To use this, you should create a GDB macro like this:
38 * set mono_debug_insert_breakpoint = 1
40 * set *mono_debug_last_breakpoint_address = 0x90
45 * define reload-symbol-files
46 * call mono_debug_make_symbols ()
47 * add-symbol-file Test-debug.o
48 * add-symbol-file /tmp/corlib.o
52 extern int mono_debug_insert_breakpoint;
54 MonoDebugHandle* mono_debug_open (MonoAssembly *assembly, MonoDebugFormat format, const char **args);
56 void mono_debug_cleanup (void);
58 void mono_debug_add_method (MonoFlowGraph *cfg);
60 void mono_debug_add_type (MonoClass *klass);
62 gchar * mono_debug_source_location_from_address (MonoMethod *method, guint32 address,
63 guint32 *line_number);
65 gint32 mono_debug_il_offset_from_address (MonoMethod *method, gint32 address);
67 gint32 mono_debug_address_from_il_offset (MonoMethod *method, gint32 il_offset);
69 int mono_method_has_breakpoint (MonoMethod* method, gboolean use_trampoline);
71 int mono_insert_breakpoint (const gchar *method_name, gboolean include_namespace);
73 int mono_insert_breakpoint_full (MonoMethodDesc *desc, gboolean use_trampoline);
75 int mono_remove_breakpoint (int breakpint_id);
77 void mono_debugger_trampoline_breakpoint_callback (void);
80 /* DEBUGGER PUBLIC FUNCTION:
82 * This is a public function which is supposed to be called from within a debugger
83 * each time the program stops. It's used to recreate the symbol file to tell the
84 * debugger about method addresses and such things. After calling this function,
85 * you must tell your debugger to reload its symbol file.
87 void mono_debug_make_symbols (void);
89 void mono_debug_write_symbols (MonoDebugHandle* debug);
92 * Address of the x86 trampoline code. This is used by the debugger to check
93 * whether a method is a trampoline.
95 extern guint8 *mono_generic_trampoline_code;
98 * Address of a special breakpoint code which is used by the debugger to get a breakpoint
99 * after compiling a method.
101 extern guint8 *mono_breakpoint_trampoline_code;
104 * There's a global data symbol called `MONO_DEBUGGER__debugger_info' which
105 * contains pointers to global variables and functions which must be accessed
108 struct _MonoDebuggerInfo {
112 guint8 **generic_trampoline_code;
113 guint8 **breakpoint_trampoline_code;
114 guint32 *symbol_file_generation;
115 guint32 *symbol_file_modified;
116 gconstpointer *notification_address;
117 MonoDebuggerSymbolFileTable **symbol_file_table;
118 gpointer (*compile_method) (MonoMethod *method);
119 guint64 (*insert_breakpoint) (guint64 method_argument, const gchar *string_argument);
120 guint64 (*remove_breakpoint) (guint64 breakpoint);
121 MonoInvokeFunc runtime_invoke;
124 struct _MonoDebuggerSymbolFileTable {
130 MonoGlobalSymbolFile *global_symfile;
131 MonoSymbolFile *symfiles [MONO_ZERO_LEN_ARRAY];
134 struct _MonoDebuggerBreakpointInfo {
136 gboolean use_trampoline;
137 MonoMethodDesc *desc;
140 #endif /* __MONO_JIT_DEBUG_H__ */