+/*
+ * mono-debug.c:
+ *
+ * Author:
+ * Mono Project (http://www.mono-project.com)
+ *
+ * Copyright 2001-2003 Ximian, Inc (http://www.ximian.com)
+ * Copyright 2004-2009 Novell, Inc (http://www.novell.com)
+ */
+
#include <config.h>
#include <mono/metadata/assembly.h>
#include <mono/metadata/tabledefs.h>
MonoSymbolTable *mono_symbol_table = NULL;
MonoDebugFormat mono_debug_format = MONO_DEBUG_FORMAT_NONE;
-gint32 mono_debug_debugger_version = 4;
+gint32 mono_debug_debugger_version = 5;
gint32 _mono_debug_using_mono_debugger = 0;
static gboolean mono_debug_initialized = FALSE;
{
g_assert (!mono_debug_initialized);
+ if (_mono_debug_using_mono_debugger)
+ format = MONO_DEBUG_FORMAT_DEBUGGER;
+
mono_debug_initialized = TRUE;
mono_debug_format = format;
mono_debugger_unlock ();
}
+/*
+ * LOCKING: Assumes the debug lock is held.
+ */
static MonoDebugHandle *
_mono_debug_get_image (MonoImage *image)
{
if (!mono_debug_initialized)
return;
+ mono_debugger_lock ();
+
handle = _mono_debug_get_image (image);
- if (!handle)
+ if (!handle) {
+ mono_debugger_unlock ();
return;
-
- mono_debugger_lock ();
+ }
mono_debugger_event (MONO_DEBUGGER_EVENT_UNLOAD_MODULE, (guint64) (gsize) handle,
handle->index);
if (mono_image_is_dynamic (image))
return NULL;
+ mono_debugger_lock ();
+
handle = _mono_debug_get_image (image);
- if (handle != NULL)
+ if (handle != NULL) {
+ mono_debugger_unlock ();
return handle;
-
- mono_debugger_lock ();
+ }
handle = g_new0 (MonoDebugHandle, 1);
handle->index = ++next_symbol_file_id;
is_wrapper = TRUE;
}
- max_size = 24 + 8 * jit->num_line_numbers +
- (20 + sizeof (gpointer)) * (1 + jit->num_params + jit->num_locals);
+ max_size = (5 * 5) + 1 + (10 * jit->num_line_numbers) +
+ (25 + sizeof (gpointer)) * (1 + jit->num_params + jit->num_locals);
if (max_size > BUFSIZ)
ptr = oldptr = g_malloc (max_size);
guint32 size, total_size, max_size;
int base_offset = 0;
- handle = _mono_debug_get_image (klass->image);
- if (!handle)
- return;
-
if (klass->generic_class || klass->rank ||
(klass->byval_arg.type == MONO_TYPE_VAR) || (klass->byval_arg.type == MONO_TYPE_MVAR))
return;
mono_debugger_lock ();
+ handle = _mono_debug_get_image (klass->image);
+ if (!handle) {
+ mono_debugger_unlock ();
+ return;
+ }
+
max_size = 12 + sizeof (gpointer);
if (max_size > BUFSIZ)
ptr = oldptr = g_malloc (max_size);
GSList *list;
guint8 *ptr;
- g_assert (mono_debug_debugger_version == 4);
+ g_assert ((mono_debug_debugger_version == 4) || (mono_debug_debugger_version == 5));
mono_debugger_lock ();
location = mono_debug_lookup_source_location (method, native_offset, domain);
if (!location) {
- mono_debugger_lock ();
- offset = il_offset_from_address (method, domain, native_offset);
- mono_debugger_unlock ();
+ if (mono_debug_initialized) {
+ mono_debugger_lock ();
+ offset = il_offset_from_address (method, domain, native_offset);
+ mono_debugger_unlock ();
+ } else {
+ offset = -1;
+ }
if (offset < 0)
res = g_strdup_printf ("at %s <0x%05x>", fname, native_offset);