X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Fmono-debug.c;h=0c66d7e9729134459be8b11d8c8425ab1197e0f4;hb=e152071d2a0061d7aa6d7f40b220b78f43132aa2;hp=0b8f8063358dea16c0fa4361f6919b9204019deb;hpb=e7528a2e37e3f79611ce29683a0a9f212a7fe661;p=mono.git diff --git a/mono/metadata/mono-debug.c b/mono/metadata/mono-debug.c index 0b8f8063358..0c66d7e9729 100644 --- a/mono/metadata/mono-debug.c +++ b/mono/metadata/mono-debug.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #define DATA_TABLE_CHUNK_SIZE 16384 @@ -72,7 +73,7 @@ struct _MonoDebugDataTable { typedef struct { const gchar *method_name; - const gchar *cil_code; + const gchar *obsolete_cil_code; guint32 wrapper_type; } MonoDebugWrapperData; @@ -110,7 +111,7 @@ gint32 mono_debug_debugger_version = 5; gint32 _mono_debug_using_mono_debugger = 0; static gboolean mono_debug_initialized = FALSE; -GHashTable *mono_debug_handles = NULL; +static GHashTable *mono_debug_handles = NULL; static GHashTable *data_table_hash = NULL; static int next_symbol_file_id = 0; @@ -122,6 +123,8 @@ static void mono_debug_add_assembly (MonoAssembly *assembly, gpointer user_data); static void mono_debug_add_type (MonoClass *klass); +static MonoDebugHandle *open_symfile_from_bundle (MonoImage *image); + void _mono_debug_init_corlib (MonoDomain *domain); extern void (*mono_debugger_class_init_func) (MonoClass *klass); @@ -159,7 +162,6 @@ free_header_data (gpointer key, gpointer value, gpointer user_data) if (header->wrapper_data) { g_free ((gpointer)header->wrapper_data->method_name); - g_free ((gpointer)header->wrapper_data->cil_code); g_slist_free (header->address_list); g_free (header->wrapper_data); } @@ -229,6 +231,12 @@ mono_debug_init (MonoDebugFormat format) mono_debug_initialized = TRUE; mono_debug_format = format; + /* + * This must be called before mono_debugger_initialize(), because the + * latter registers GC roots. + */ + mono_gc_base_init (); + mono_debugger_initialize (_mono_debug_using_mono_debugger); mono_debugger_lock (); @@ -292,8 +300,13 @@ mono_debug_cleanup (void) data_table_hash = NULL; } - g_free (mono_symbol_table); - mono_symbol_table = NULL; + if (mono_symbol_table) { + if (mono_symbol_table->global_data_table) + free_data_table (mono_symbol_table->global_data_table); + + g_free (mono_symbol_table); + mono_symbol_table = NULL; + } } void @@ -418,8 +431,14 @@ mono_debug_open_image (MonoImage *image, const guint8 *raw_contents, int size) static void mono_debug_add_assembly (MonoAssembly *assembly, gpointer user_data) { + MonoDebugHandle *handle; + MonoImage *image; + mono_debugger_lock (); - mono_debug_open_image (mono_assembly_get_image (assembly), NULL, 0); + image = mono_assembly_get_image (assembly); + handle = open_symfile_from_bundle (image); + if (!handle) + mono_debug_open_image (image, NULL, 0); mono_debugger_unlock (); } @@ -654,21 +673,13 @@ mono_debug_add_method (MonoMethod *method, MonoDebugMethodJitInfo *jit, MonoDoma g_hash_table_insert (table->method_hash, declaring, header); if (is_wrapper) { - const unsigned char* il_code; - MonoMethodHeader *mheader; MonoDebugWrapperData *wrapper; - guint32 il_codesize; - - mheader = mono_method_get_header (declaring); - il_code = mono_method_header_get_code (mheader, &il_codesize, NULL); header->wrapper_data = wrapper = g_new0 (MonoDebugWrapperData, 1); wrapper->wrapper_type = method->wrapper_type; wrapper->method_name = mono_method_full_name (declaring, TRUE); - wrapper->cil_code = mono_disasm_code ( - NULL, declaring, il_code, il_code + il_codesize); - mono_metadata_free_mh (mheader); + wrapper->obsolete_cil_code = ""; } } else { address->header.wrapper_data = header->wrapper_data; @@ -1035,7 +1046,7 @@ mono_debug_lookup_source_location (MonoMethod *method, guint32 address, MonoDoma mono_debugger_lock (); minfo = _mono_debug_lookup_method (method); - if (!minfo || !minfo->handle || !minfo->handle->symfile || !minfo->handle->symfile->offset_table) { + if (!minfo || !minfo->handle || !minfo->handle->symfile || !mono_debug_symfile_is_loaded (minfo->handle->symfile)) { mono_debugger_unlock (); return NULL; } @@ -1055,31 +1066,25 @@ mono_debug_lookup_source_location (MonoMethod *method, guint32 address, MonoDoma * mono_debug_lookup_locals: * * Return information about the local variables of MINFO. - * NAMES and INDEXES are set to g_malloc-ed arrays containing the local names and - * their IL indexes. - * Returns: the number of elements placed into the arrays, or -1 if there is no - * local variable info. + * The result should be freed using mono_debug_symfile_free_locals (). */ -int -mono_debug_lookup_locals (MonoMethod *method, char ***names, int **indexes) +MonoDebugLocalsInfo* +mono_debug_lookup_locals (MonoMethod *method) { MonoDebugMethodInfo *minfo; - int res; - - *names = NULL; - *indexes = NULL; + MonoDebugLocalsInfo *res; if (mono_debug_format == MONO_DEBUG_FORMAT_NONE) - return -1; + return NULL; mono_debugger_lock (); minfo = _mono_debug_lookup_method (method); - if (!minfo || !minfo->handle || !minfo->handle->symfile || !minfo->handle->symfile->offset_table) { + if (!minfo || !minfo->handle || !minfo->handle->symfile || !mono_debug_symfile_is_loaded (minfo->handle->symfile)) { mono_debugger_unlock (); - return -1; + return NULL; } - res = mono_debug_symfile_lookup_locals (minfo, names, indexes); + res = mono_debug_symfile_lookup_locals (minfo); mono_debugger_unlock (); return res; @@ -1191,3 +1196,45 @@ mono_is_debugger_attached (void) return is_attached; } +/* + * Bundles + */ + +typedef struct _BundledSymfile BundledSymfile; + +struct _BundledSymfile { + BundledSymfile *next; + const char *aname; + const mono_byte *raw_contents; + int size; +}; + +static BundledSymfile *bundled_symfiles = NULL; + +void +mono_register_symfile_for_assembly (const char *assembly_name, const mono_byte *raw_contents, int size) +{ + BundledSymfile *bsymfile; + + bsymfile = g_new0 (BundledSymfile, 1); + bsymfile->aname = assembly_name; + bsymfile->raw_contents = raw_contents; + bsymfile->size = size; + bsymfile->next = bundled_symfiles; + bundled_symfiles = bsymfile; +} + +static MonoDebugHandle * +open_symfile_from_bundle (MonoImage *image) +{ + BundledSymfile *bsymfile; + + for (bsymfile = bundled_symfiles; bsymfile; bsymfile = bsymfile->next) { + if (strcmp (bsymfile->aname, image->module_name)) + continue; + + return mono_debug_open_image (image, bsymfile->raw_contents, bsymfile->size); + } + + return NULL; +}