#include <mono/metadata/mono-debug.h>
#include <mono/metadata/mono-debug-debugger.h>
#include <mono/metadata/mono-endian.h>
+#include <mono/metadata/gc-internal.h>
#include <string.h>
#define DATA_TABLE_CHUNK_SIZE 16384
typedef struct {
const gchar *method_name;
- const gchar *cil_code;
+ const gchar *obsolete_cil_code;
guint32 wrapper_type;
} MonoDebugWrapperData;
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;
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);
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);
}
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 ();
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
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 ();
}
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;
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;
}
* 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;
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;
+}