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 (const char *name, MonoDebugFormat format, const char **args);
56 void mono_debug_cleanup (void);
58 void mono_debug_add_image (MonoDebugHandle* debug, MonoImage *image);
60 MonoDebugHandle* mono_debug_handle_from_class (MonoClass *klass);
62 void mono_debug_add_method (MonoFlowGraph *cfg);
64 void mono_debug_add_type (MonoClass *klass);
66 gchar * mono_debug_source_location_from_address (MonoMethod *method, guint32 address,
67 guint32 *line_number);
69 gint32 mono_debug_il_offset_from_address (MonoMethod *method, gint32 address);
71 gint32 mono_debug_address_from_il_offset (MonoMethod *method, gint32 il_offset);
73 int mono_method_has_breakpoint (MonoMethod* method, gboolean use_trampoline);
75 int mono_insert_breakpoint (const gchar *method_name, gboolean include_namespace);
77 int mono_insert_breakpoint_full (MonoMethodDesc *desc, gboolean use_trampoline);
79 int mono_remove_breakpoint (int breakpint_id);
81 /* DEBUGGER PUBLIC FUNCTION:
83 * This is a public function which is supposed to be called from within a debugger
84 * each time the program stops. It's used to recreate the symbol file to tell the
85 * debugger about method addresses and such things. After calling this function,
86 * you must tell your debugger to reload its symbol file.
88 void mono_debug_make_symbols (void);
90 void mono_debug_write_symbols (MonoDebugHandle* debug);
93 * Address of the x86 trampoline code. This is used by the debugger to check
94 * whether a method is a trampoline.
96 extern guint8 *mono_generic_trampoline_code;
99 * Address of a special breakpoint code which is used by the debugger to get a breakpoint
100 * after compiling a method.
102 extern guint8 *mono_breakpoint_trampoline_code;
105 * There's a global data symbol called `MONO_DEBUGGER__debugger_info' which
106 * contains pointers to global variables and functions which must be accessed
109 struct _MonoDebuggerInfo {
113 guint8 **generic_trampoline_code;
114 guint8 **breakpoint_trampoline_code;
115 guint32 *symbol_file_generation;
116 MonoDebuggerSymbolFileTable **symbol_file_table;
117 int (*update_symbol_file_table) (void);
118 gpointer (*compile_method) (MonoMethod *method);
119 guint64 (*insert_breakpoint) (guint64 method_argument, const gchar *string_argument);
120 guint64 (*remove_breakpoint) (guint64 breakpoint);
123 struct _MonoDebuggerSymbolFileTable {
129 MonoSymbolFile *symfiles [MONO_ZERO_LEN_ARRAY];
132 struct _MonoDebuggerBreakpointInfo {
134 gboolean use_trampoline;
135 MonoMethodDesc *desc;
138 #endif /* __MONO_JIT_DEBUG_H__ */