2003-01-05 Martin Baulig <martin@ximian.com>
[mono.git] / mono / jit / debug.h
1 #ifndef __MONO_JIT_DEBUG_H__
2 #define __MONO_JIT_DEBUG_H__
3
4 #include <glib.h>
5 #include <stdio.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>
10
11 typedef struct _MonoDebugHandle                 MonoDebugHandle;
12 typedef struct _MonoDebuggerInfo                MonoDebuggerInfo;
13 typedef struct _MonoDebuggerSymbolFileTable     MonoDebuggerSymbolFileTable;
14 typedef struct _MonoDebuggerBreakpointInfo      MonoDebuggerBreakpointInfo;
15
16 typedef enum {
17         MONO_DEBUG_FORMAT_NONE,
18         MONO_DEBUG_FORMAT_STABS,
19         MONO_DEBUG_FORMAT_DWARF2,
20         MONO_DEBUG_FORMAT_MONO,
21         /* This format may only be used when the JIT is being run by the
22          * Mono Debugger.
23          */
24         MONO_DEBUG_FORMAT_MONO_DEBUGGER
25 } MonoDebugFormat;
26
27 extern MonoDebugFormat mono_debug_format;
28
29 /*
30  * This variable is intended to be set in a debugger.
31  *
32  * If it's non-zero, arch_compile_method() will insert a breakpoint next time
33  * it compiles a method.
34  *
35  * If it's positive, it acts as a counter which is decremented each time it's
36  * used. Set it to a negative value to make arch_compile_method() insert a
37  * breakpoint for each method.
38  *
39  * To use this, you should create a GDB macro like this:
40  *
41  *    define enter
42  *      set mono_debug_insert_breakpoint = 1
43  *      continue
44  *      set *mono_debug_last_breakpoint_address = 0x90
45  *      reload-symbol-files
46  *      frame
47  *    end
48  *
49  *    define reload-symbol-files
50  *      call mono_debug_make_symbols ()
51  *      add-symbol-file Test-debug.o
52  *      add-symbol-file /tmp/corlib.o
53  *    end
54  *
55  */
56 extern int mono_debug_insert_breakpoint;
57
58 MonoDebugHandle* mono_debug_open (MonoAssembly *assembly, MonoDebugFormat format, const char **args);
59
60 void           mono_debug_cleanup (void);
61
62 void           mono_debug_add_method (MonoFlowGraph *cfg);
63
64 void           mono_debug_add_type (MonoClass *klass);
65
66 gchar *        mono_debug_source_location_from_address (MonoMethod *method, guint32 address,
67                                                         guint32 *line_number);
68
69 gint32         mono_debug_il_offset_from_address (MonoMethod *method, gint32 address);
70
71 gint32         mono_debug_address_from_il_offset (MonoMethod *method, gint32 il_offset);
72
73 int            mono_method_has_breakpoint (MonoMethod* method, gboolean use_trampoline);
74
75 int            mono_insert_breakpoint (const gchar *method_name, gboolean include_namespace);
76
77 int            mono_insert_breakpoint_full (MonoMethodDesc *desc, gboolean use_trampoline);
78
79 int            mono_remove_breakpoint (int breakpint_id);
80
81 void           mono_debugger_trampoline_breakpoint_callback (void);
82
83
84 /* DEBUGGER PUBLIC FUNCTION:
85  *
86  * This is a public function which is supposed to be called from within a debugger
87  * each time the program stops. It's used to recreate the symbol file to tell the
88  * debugger about method addresses and such things. After calling this function,
89  * you must tell your debugger to reload its symbol file.
90  */
91 void           mono_debug_make_symbols (void);
92
93 void           mono_debug_write_symbols (MonoDebugHandle* debug);
94
95 /*
96  * Address of the x86 trampoline code.  This is used by the debugger to check
97  * whether a method is a trampoline.
98  */
99 extern guint8 *mono_generic_trampoline_code;
100
101 /*
102  * Address of a special breakpoint code which is used by the debugger to get a breakpoint
103  * after compiling a method.
104  */
105 extern guint8 *mono_breakpoint_trampoline_code;
106
107 /*
108  * There's a global data symbol called `MONO_DEBUGGER__debugger_info' which
109  * contains pointers to global variables and functions which must be accessed
110  * by the debugger.
111  */
112 struct _MonoDebuggerInfo {
113         guint64 magic;
114         guint32 version;
115         guint32 total_size;
116         guint8 **generic_trampoline_code;
117         guint8 **breakpoint_trampoline_code;
118         guint32 *symbol_file_generation;
119         guint32 *symbol_file_modified;
120         gconstpointer *notification_address;
121         MonoDebuggerSymbolFileTable **symbol_file_table;
122         gpointer (*compile_method) (MonoMethod *method);
123         guint64 (*insert_breakpoint) (guint64 method_argument, const gchar *string_argument);
124         guint64 (*remove_breakpoint) (guint64 breakpoint);
125         MonoInvokeFunc runtime_invoke;
126 };
127
128 struct _MonoDebuggerSymbolFileTable {
129         guint64 magic;
130         guint32 version;
131         guint32 total_size;
132         guint32 count;
133         guint32 generation;
134         MonoGlobalSymbolFile *global_symfile;
135         MonoSymbolFile *symfiles [MONO_ZERO_LEN_ARRAY];
136 };
137
138 struct _MonoDebuggerBreakpointInfo {
139         guint32 index;
140         gboolean use_trampoline;
141         MonoMethodDesc *desc;
142 };
143
144 #endif /* __MONO_JIT_DEBUG_H__ */