#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 <mono/metadata/gc-internals.h>
#include <mono/metadata/mempool.h>
+#include <mono/metadata/debug-mono-ppdb.h>
#include <string.h>
#define ALIGN_TO(val,align) ((((guint64)val) + ((align) - 1)) & ~((align) - 1))
static mono_mutex_t debugger_lock_mutex;
-static int initialized = 0;
static gboolean is_attached = FALSE;
static MonoDebugHandle *mono_debug_open_image (MonoImage *image, const guint8 *raw_contents, int size);
static void
free_debug_handle (MonoDebugHandle *handle)
{
+ if (handle->ppdb)
+ mono_ppdb_close (handle);
if (handle->symfile)
mono_debug_close_mono_symbol_file (handle->symfile);
/* decrease the refcount added with mono_image_addref () */
mono_debug_initialized = TRUE;
mono_debug_format = format;
- mono_debugger_initialize ();
+ mono_mutex_init_recursive (&debugger_lock_mutex);
mono_debugger_lock ();
handle->image = image;
mono_image_addref (image);
- handle->symfile = mono_debug_open_mono_symbols (
- handle, raw_contents, size, FALSE);
+ /* Try a ppdb file first */
+ handle->ppdb = mono_ppdb_load_file (handle->image, raw_contents, size);
+
+ if (!handle->ppdb)
+ handle->symfile = mono_debug_open_mono_symbols (handle, raw_contents, size, FALSE);
g_hash_table_insert (mono_debug_handles, image, handle);
if (data->minfo)
return;
- if (handle->symfile)
+ if (handle->ppdb)
+ data->minfo = mono_ppdb_lookup_method (handle, data->method);
+ else if (handle->symfile)
data->minfo = mono_debug_symfile_lookup_method (handle, data->method);
}
mono_debugger_lock ();
minfo = mono_debug_lookup_method_internal (method);
- if (!minfo || !minfo->handle || !minfo->handle->symfile || !mono_debug_symfile_is_loaded (minfo->handle->symfile)) {
+ if (!minfo || !minfo->handle) {
+ mono_debugger_unlock ();
+ return NULL;
+ }
+
+ if (!minfo->handle->ppdb && (!minfo->handle->symfile || !mono_debug_symfile_is_loaded (minfo->handle->symfile))) {
mono_debugger_unlock ();
return NULL;
}
return NULL;
}
- location = mono_debug_symfile_lookup_location (minfo, offset);
+ if (minfo->handle->ppdb)
+ location = mono_ppdb_lookup_location (minfo, offset);
+ else
+ location = mono_debug_symfile_lookup_location (minfo, offset);
+ mono_debugger_unlock ();
+ return location;
+}
+
+MonoDebugSourceLocation *
+mono_debug_method_lookup_location (MonoDebugMethodInfo *minfo, int il_offset)
+{
+ MonoDebugSourceLocation *location;
+
+ mono_debugger_lock ();
+ if (minfo->handle->ppdb)
+ location = mono_ppdb_lookup_location (minfo, il_offset);
+ else
+ location = mono_debug_symfile_lookup_location (minfo, il_offset);
mono_debugger_unlock ();
return location;
}
* mono_debug_lookup_locals:
*
* Return information about the local variables of MINFO.
- * The result should be freed using mono_debug_symfile_free_locals ().
+ * The result should be freed using mono_debug_free_locals ().
*/
MonoDebugLocalsInfo*
mono_debug_lookup_locals (MonoMethod *method)
mono_debugger_lock ();
minfo = mono_debug_lookup_method_internal (method);
- if (!minfo || !minfo->handle || !minfo->handle->symfile || !mono_debug_symfile_is_loaded (minfo->handle->symfile)) {
+ if (!minfo || !minfo->handle) {
mono_debugger_unlock ();
return NULL;
}
- res = mono_debug_symfile_lookup_locals (minfo);
+ if (minfo->handle->ppdb) {
+ res = mono_ppdb_lookup_locals (minfo);
+ } else {
+ if (!minfo->handle->symfile || !mono_debug_symfile_is_loaded (minfo->handle->symfile))
+ res = NULL;
+ else
+ res = mono_debug_symfile_lookup_locals (minfo);
+ }
mono_debugger_unlock ();
return res;
}
+/*
+ * mono_debug_free_locals:
+ *
+ * Free all the data allocated by mono_debug_lookup_locals ().
+ */
+void
+mono_debug_free_locals (MonoDebugLocalsInfo *info)
+{
+ int i;
+
+ for (i = 0; i < info->num_locals; ++i)
+ g_free (info->locals [i].name);
+ g_free (info->locals);
+ g_free (info->code_blocks);
+ g_free (info);
+}
+
/**
* mono_debug_free_source_location:
* @location: A `MonoDebugSourceLocation'.
void
mono_debugger_lock (void)
{
- g_assert (initialized);
+ g_assert (mono_debug_initialized);
mono_mutex_lock (&debugger_lock_mutex);
}
void
mono_debugger_unlock (void)
{
- g_assert (initialized);
+ g_assert (mono_debug_initialized);
mono_mutex_unlock (&debugger_lock_mutex);
}
-void
-mono_debugger_initialize ()
-{
- mono_mutex_init_recursive (&debugger_lock_mutex);
- initialized = 1;
-}
-
/**
* mono_debug_enabled:
*
{
return mono_debug_format != MONO_DEBUG_FORMAT_NONE;
}
+
+void
+mono_debug_get_seq_points (MonoDebugMethodInfo *minfo, char **source_file, GPtrArray **source_file_list, int **source_files, MonoSymSeqPoint **seq_points, int *n_seq_points)
+{
+ if (minfo->handle->ppdb)
+ mono_ppdb_get_seq_points (minfo, source_file, source_file_list, source_files, seq_points, n_seq_points);
+ else
+ mono_debug_symfile_get_seq_points (minfo, source_file, source_file_list, source_files, seq_points, n_seq_points);
+}