Merge pull request #5714 from alexischr/update_bockbuild
[mono.git] / mono / metadata / mono-debug.c
index 1cfc8cf65f4c7be36104774704accb98545064ac..4230399ec10242c2c3d339e80ed8271981bb4f96 100644 (file)
@@ -1,5 +1,5 @@
-/*
- * mono-debug.c: 
+/**
+ * \file
  *
  * Author:
  *     Mono Project (http://www.mono-project.com)
@@ -7,6 +7,7 @@
  * Copyright 2001-2003 Ximian, Inc (http://www.ximian.com)
  * Copyright 2004-2009 Novell, Inc (http://www.novell.com)
  * Copyright 2011 Xamarin Inc (http://www.xamarin.com)
+ * Licensed under the MIT license. See LICENSE file in the project root for full license information.
  */
 
 #include <config.h>
 #include <mono/metadata/appdomain.h>
 #include <mono/metadata/class-internals.h>
 #include <mono/metadata/mono-debug.h>
-#include <mono/metadata/mono-debug-debugger.h>
+#include <mono/metadata/debug-internals.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-symfile.h>
+#include <mono/metadata/debug-mono-ppdb.h>
+#include <mono/metadata/exception-internals.h>
+#include <mono/metadata/runtime.h>
 #include <string.h>
 
 #define ALIGN_TO(val,align) ((((guint64)val) + ((align) - 1)) & ~((align) - 1))
@@ -59,7 +64,6 @@ static GHashTable *data_table_hash;
 
 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);
@@ -100,7 +104,7 @@ lookup_data_table (MonoDomain *domain)
 {
        MonoDebugDataTable *table;
 
-       table = g_hash_table_lookup (data_table_hash, domain);
+       table = (MonoDebugDataTable *)g_hash_table_lookup (data_table_hash, domain);
        if (!table) {
                g_error ("lookup_data_table () failed for %p\n", domain);
                g_assert (table);
@@ -111,6 +115,8 @@ lookup_data_table (MonoDomain *domain)
 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 () */
@@ -135,7 +141,7 @@ mono_debug_init (MonoDebugFormat format)
        mono_debug_initialized = TRUE;
        mono_debug_format = format;
 
-       mono_debugger_initialize ();
+       mono_os_mutex_init_recursive (&debugger_lock_mutex);
 
        mono_debugger_lock ();
 
@@ -172,17 +178,18 @@ mono_debug_cleanup (void)
        }
 }
 
+/**
+ * mono_debug_domain_create:
+ */
 void
 mono_debug_domain_create (MonoDomain *domain)
 {
-       MonoDebugDataTable *table;
-
        if (!mono_debug_initialized)
                return;
 
        mono_debugger_lock ();
 
-       table = create_data_table (domain);
+       create_data_table (domain);
 
        mono_debugger_unlock ();
 }
@@ -197,7 +204,7 @@ mono_debug_domain_unload (MonoDomain *domain)
 
        mono_debugger_lock ();
 
-       table = g_hash_table_lookup (data_table_hash, domain);
+       table = (MonoDebugDataTable *)g_hash_table_lookup (data_table_hash, domain);
        if (!table) {
                g_warning (G_STRLOC ": unloading unknown domain %p / %d",
                           domain, mono_domain_get_id (domain));
@@ -216,9 +223,12 @@ mono_debug_domain_unload (MonoDomain *domain)
 static MonoDebugHandle *
 mono_debug_get_image (MonoImage *image)
 {
-       return g_hash_table_lookup (mono_debug_handles, image);
+       return (MonoDebugHandle *)g_hash_table_lookup (mono_debug_handles, image);
 }
 
+/**
+ * mono_debug_close_image:
+ */
 void
 mono_debug_close_image (MonoImage *image)
 {
@@ -261,8 +271,11 @@ mono_debug_open_image (MonoImage *image, const guint8 *raw_contents, int size)
        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);
 
@@ -300,7 +313,9 @@ lookup_method_func (gpointer key, gpointer value, gpointer user_data)
        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);
 }
 
@@ -322,21 +337,60 @@ mono_debug_lookup_method_internal (MonoMethod *method)
 /**
  * mono_debug_lookup_method:
  *
- * Lookup symbol file information for the method @method.  The returned
- * `MonoDebugMethodInfo' is a private structure, but it can be passed to
- * mono_debug_symfile_lookup_location().
+ * Lookup symbol file information for the method \p method.  The returned
+ * \c MonoDebugMethodInfo is a private structure, but it can be passed to
+ * \c mono_debug_symfile_lookup_location.
  */
 MonoDebugMethodInfo *
 mono_debug_lookup_method (MonoMethod *method)
 {
        MonoDebugMethodInfo *minfo;
 
+       if (mono_debug_format == MONO_DEBUG_FORMAT_NONE)
+               return NULL;
+
        mono_debugger_lock ();
        minfo = mono_debug_lookup_method_internal (method);
        mono_debugger_unlock ();
        return minfo;
 }
 
+typedef struct
+{
+       gboolean found;
+       MonoImage *image;
+} LookupImageData;
+
+static void
+lookup_image_func (gpointer key, gpointer value, gpointer user_data)
+{
+       MonoDebugHandle *handle = (MonoDebugHandle *) value;
+       LookupImageData *data = (LookupImageData *) user_data;
+
+       if (data->found)
+               return;
+
+       if (handle->image == data->image && handle->symfile)
+               data->found = TRUE;
+}
+
+gboolean
+mono_debug_image_has_debug_info (MonoImage *image)
+{
+       LookupImageData data;
+
+       if (!mono_debug_handles)
+               return FALSE;
+
+       memset (&data, 0, sizeof (data));
+       data.image = image;
+
+       mono_debugger_lock ();
+       g_hash_table_foreach (mono_debug_handles, lookup_image_func, &data);
+       mono_debugger_unlock ();
+       return data.found;
+}
+
 static inline void
 write_leb128 (guint32 value, guint8 *ptr, guint8 **rptr)
 {
@@ -383,13 +437,14 @@ write_variable (MonoDebugVarInfo *var, guint8 *ptr, guint8 **rptr)
        *rptr = ptr;
 }
 
+/**
+ * mono_debug_add_method:
+ */
 MonoDebugMethodAddress *
 mono_debug_add_method (MonoMethod *method, MonoDebugMethodJitInfo *jit, MonoDomain *domain)
 {
        MonoDebugDataTable *table;
        MonoDebugMethodAddress *address;
-       MonoDebugMethodInfo *minfo;
-       MonoDebugHandle *handle;
        guint8 buffer [BUFSIZ];
        guint8 *ptr, *oldptr;
        guint32 i, size, total_size, max_size;
@@ -398,14 +453,11 @@ mono_debug_add_method (MonoMethod *method, MonoDebugMethodJitInfo *jit, MonoDoma
 
        table = lookup_data_table (domain);
 
-       handle = mono_debug_get_image (method->klass->image);
-       minfo = mono_debug_lookup_method_internal (method);
-
        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);
+               ptr = oldptr = (guint8 *)g_malloc (max_size);
        else
                ptr = oldptr = buffer;
 
@@ -419,23 +471,25 @@ mono_debug_add_method (MonoMethod *method, MonoDebugMethodJitInfo *jit, MonoDoma
                write_sleb128 (lne->il_offset, ptr, &ptr);
                write_sleb128 (lne->native_offset, ptr, &ptr);
        }
-
-       *ptr++ = jit->this_var ? 1 : 0;
-       if (jit->this_var)
-               write_variable (jit->this_var, ptr, &ptr);
-
-       write_leb128 (jit->num_params, ptr, &ptr);
-       for (i = 0; i < jit->num_params; i++)
-               write_variable (&jit->params [i], ptr, &ptr);
-
-       write_leb128 (jit->num_locals, ptr, &ptr);
-       for (i = 0; i < jit->num_locals; i++)
-               write_variable (&jit->locals [i], ptr, &ptr);
-
-       *ptr++ = jit->gsharedvt_info_var ? 1 : 0;
-       if (jit->gsharedvt_info_var) {
-               write_variable (jit->gsharedvt_info_var, ptr, &ptr);
-               write_variable (jit->gsharedvt_locals_var, ptr, &ptr);
+       write_leb128 (jit->has_var_info, ptr, &ptr);
+       if (jit->has_var_info) {
+               *ptr++ = jit->this_var ? 1 : 0;
+               if (jit->this_var)
+                       write_variable (jit->this_var, ptr, &ptr);
+
+               write_leb128 (jit->num_params, ptr, &ptr);
+               for (i = 0; i < jit->num_params; i++)
+                       write_variable (&jit->params [i], ptr, &ptr);
+
+               write_leb128 (jit->num_locals, ptr, &ptr);
+               for (i = 0; i < jit->num_locals; i++)
+                       write_variable (&jit->locals [i], ptr, &ptr);
+
+               *ptr++ = jit->gsharedvt_info_var ? 1 : 0;
+               if (jit->gsharedvt_info_var) {
+                       write_variable (jit->gsharedvt_info_var, ptr, &ptr);
+                       write_variable (jit->gsharedvt_locals_var, ptr, &ptr);
+               }
        }
 
        size = ptr - oldptr;
@@ -443,9 +497,9 @@ mono_debug_add_method (MonoMethod *method, MonoDebugMethodJitInfo *jit, MonoDoma
        total_size = size + sizeof (MonoDebugMethodAddress);
 
        if (method_is_dynamic (method)) {
-               address = g_malloc0 (total_size);
+               address = (MonoDebugMethodAddress *)g_malloc0 (total_size);
        } else {
-               address = mono_mempool_alloc (table->mp, total_size);
+               address = (MonoDebugMethodAddress *)mono_mempool_alloc (table->mp, total_size);
        }
 
        address->code_start = jit->code_start;
@@ -476,7 +530,7 @@ mono_debug_remove_method (MonoMethod *method, MonoDomain *domain)
 
        table = lookup_data_table (domain);
 
-       address = g_hash_table_lookup (table->method_address_hash, method);
+       address = (MonoDebugMethodAddress *)g_hash_table_lookup (table->method_address_hash, method);
        if (address)
                g_free (address);
 
@@ -485,6 +539,9 @@ mono_debug_remove_method (MonoMethod *method, MonoDomain *domain)
        mono_debugger_unlock ();
 }
 
+/**
+ * mono_debug_add_delegate_trampoline:
+ */
 void
 mono_debug_add_delegate_trampoline (gpointer code, int size)
 {
@@ -540,7 +597,7 @@ read_variable (MonoDebugVarInfo *var, guint8 *ptr, guint8 **rptr)
        var->size = read_leb128 (ptr, &ptr);
        var->begin_scope = read_leb128 (ptr, &ptr);
        var->end_scope = read_leb128 (ptr, &ptr);
-       READ_UNALIGNED (gpointer, ptr, var->type);
+       READ_UNALIGNED (MonoType *, ptr, var->type);
        ptr += sizeof (gpointer);
        *rptr = ptr;
 }
@@ -583,27 +640,29 @@ mono_debug_read_method (MonoDebugMethodAddress *address)
                lne->il_offset = read_sleb128 (ptr, &ptr);
                lne->native_offset = read_sleb128 (ptr, &ptr);
        }
+       jit->has_var_info = read_leb128 (ptr, &ptr);
+       if (jit->has_var_info) {
+               if (*ptr++) {
+                       jit->this_var = g_new0 (MonoDebugVarInfo, 1);
+                       read_variable (jit->this_var, ptr, &ptr);
+               }
 
-       if (*ptr++) {
-               jit->this_var = g_new0 (MonoDebugVarInfo, 1);
-               read_variable (jit->this_var, ptr, &ptr);
-       }
-
-       jit->num_params = read_leb128 (ptr, &ptr);
-       jit->params = g_new0 (MonoDebugVarInfo, jit->num_params);
-       for (i = 0; i < jit->num_params; i++)
-               read_variable (&jit->params [i], ptr, &ptr);
-
-       jit->num_locals = read_leb128 (ptr, &ptr);
-       jit->locals = g_new0 (MonoDebugVarInfo, jit->num_locals);
-       for (i = 0; i < jit->num_locals; i++)
-               read_variable (&jit->locals [i], ptr, &ptr);
-
-       if (*ptr++) {
-               jit->gsharedvt_info_var = g_new0 (MonoDebugVarInfo, 1);
-               jit->gsharedvt_locals_var = g_new0 (MonoDebugVarInfo, 1);
-               read_variable (jit->gsharedvt_info_var, ptr, &ptr);
-               read_variable (jit->gsharedvt_locals_var, ptr, &ptr);
+               jit->num_params = read_leb128 (ptr, &ptr);
+               jit->params = g_new0 (MonoDebugVarInfo, jit->num_params);
+               for (i = 0; i < jit->num_params; i++)
+                       read_variable (&jit->params [i], ptr, &ptr);
+
+               jit->num_locals = read_leb128 (ptr, &ptr);
+               jit->locals = g_new0 (MonoDebugVarInfo, jit->num_locals);
+               for (i = 0; i < jit->num_locals; i++)
+                       read_variable (&jit->locals [i], ptr, &ptr);
+
+               if (*ptr++) {
+                       jit->gsharedvt_info_var = g_new0 (MonoDebugVarInfo, 1);
+                       jit->gsharedvt_locals_var = g_new0 (MonoDebugVarInfo, 1);
+                       read_variable (jit->gsharedvt_info_var, ptr, &ptr);
+                       read_variable (jit->gsharedvt_locals_var, ptr, &ptr);
+               }
        }
 
        return jit;
@@ -616,7 +675,7 @@ find_method (MonoMethod *method, MonoDomain *domain)
        MonoDebugMethodAddress *address;
 
        table = lookup_data_table (domain);
-       address = g_hash_table_lookup (table->method_address_hash, method);
+       address = (MonoDebugMethodAddress *)g_hash_table_lookup (table->method_address_hash, method);
 
        if (!address)
                return NULL;
@@ -672,8 +731,8 @@ cleanup_and_fail:
 /**
  * mono_debug_il_offset_from_address:
  *
- *   Compute the IL offset corresponding to NATIVE_OFFSET inside the native
- * code of METHOD in DOMAIN.
+ * Compute the IL offset corresponding to \p native_offset inside the native
+ * code of \p method in \p domain.
  */
 gint32
 mono_debug_il_offset_from_address (MonoMethod *method, MonoDomain *domain, guint32 native_offset)
@@ -691,14 +750,12 @@ mono_debug_il_offset_from_address (MonoMethod *method, MonoDomain *domain, guint
 
 /**
  * mono_debug_lookup_source_location:
- * @address: Native offset within the @method's machine code.
- *
+ * \param address Native offset within the \p method's machine code.
  * Lookup the source code corresponding to the machine instruction located at
- * native offset @address within @method.
- *
- * The returned `MonoDebugSourceLocation' contains both file / line number
+ * native offset \p address within \p method.
+ * The returned \c MonoDebugSourceLocation contains both file / line number
  * information and the corresponding IL offset.  It must be freed by
- * mono_debug_free_source_location().
+ * \c mono_debug_free_source_location.
  */
 MonoDebugSourceLocation *
 mono_debug_lookup_source_location (MonoMethod *method, guint32 address, MonoDomain *domain)
@@ -712,7 +769,12 @@ mono_debug_lookup_source_location (MonoMethod *method, guint32 address, MonoDoma
 
        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;
        }
@@ -723,7 +785,58 @@ mono_debug_lookup_source_location (MonoMethod *method, guint32 address, MonoDoma
                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;
+}
+
+/**
+ * mono_debug_lookup_source_location_by_il:
+ *
+ *   Same as mono_debug_lookup_source_location but take an IL_OFFSET argument.
+ */
+MonoDebugSourceLocation *
+mono_debug_lookup_source_location_by_il (MonoMethod *method, guint32 il_offset, MonoDomain *domain)
+{
+       MonoDebugMethodInfo *minfo;
+       MonoDebugSourceLocation *location;
+
+       if (mono_debug_format == MONO_DEBUG_FORMAT_NONE)
+               return NULL;
+
+       mono_debugger_lock ();
+       minfo = mono_debug_lookup_method_internal (method);
+       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;
+       }
+
+       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;
+}
+
+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;
 }
@@ -732,7 +845,7 @@ mono_debug_lookup_source_location (MonoMethod *method, guint32 address, MonoDoma
  * 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)
@@ -745,22 +858,91 @@ 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_lookup_method_async_debug_info:
+*
+*   Return information about the async stepping information of method.
+* The result should be freed using mono_debug_free_async_debug_info ().
+*/
+MonoDebugMethodAsyncInfo*
+mono_debug_lookup_method_async_debug_info (MonoMethod *method)
+{
+       MonoDebugMethodInfo *minfo;
+       MonoDebugMethodAsyncInfo *res = NULL;
+
+       if (mono_debug_format == MONO_DEBUG_FORMAT_NONE)
+               return NULL;
+
+       mono_debugger_lock ();
+       minfo = mono_debug_lookup_method_internal (method);
+       if (!minfo || !minfo->handle) {
+               mono_debugger_unlock ();
+               return NULL;
+       }
+
+       if (minfo->handle->ppdb)
+               res = mono_ppdb_lookup_method_async_debug_info (minfo);
+
+       mono_debugger_unlock ();
+
+       return res;
+}
+
+/*
+ * mono_debug_free_method_async_debug_info:
+ *
+ *   Free all the data allocated by mono_debug_lookup_method_async_debug_info ().
+ */
+void
+mono_debug_free_method_async_debug_info (MonoDebugMethodAsyncInfo *info)
+{
+       if (info->num_awaits) {
+               g_free (info->yield_offsets);
+               g_free (info->resume_offsets);
+               g_free (info->move_next_method_token);
+       }
+       g_free (info);
+}
+
 /**
  * mono_debug_free_source_location:
- * @location: A `MonoDebugSourceLocation'.
- *
- * Frees the @location.
+ * \param location A \c MonoDebugSourceLocation
+ * Frees the \p location.
  */
 void
 mono_debug_free_source_location (MonoDebugSourceLocation *location)
@@ -771,11 +953,18 @@ mono_debug_free_source_location (MonoDebugSourceLocation *location)
        }
 }
 
+static int (*get_seq_point) (MonoDomain *domain, MonoMethod *method, gint32 native_offset);
+
+void
+mono_install_get_seq_point (MonoGetSeqPointFunc func)
+{
+       get_seq_point = func;
+}
+
 /**
  * mono_debug_print_stack_frame:
- * @native_offset: Native offset within the @method's machine code.
- *
- * Conventient wrapper around mono_debug_lookup_source_location() which can be
+ * \param native_offset Native offset within the \p method's machine code.
+ * Conventient wrapper around \c mono_debug_lookup_source_location which can be
  * used if you only want to use the location to print a stack frame.
  */
 gchar *
@@ -801,10 +990,22 @@ mono_debug_print_stack_frame (MonoMethod *method, guint32 native_offset, MonoDom
                        offset = -1;
                }
 
+               if (offset < 0 && get_seq_point)
+                       offset = get_seq_point (domain, method, native_offset);
+
                if (offset < 0)
                        res = g_strdup_printf ("at %s <0x%05x>", fname, native_offset);
-               else
-                       res = g_strdup_printf ("at %s <IL 0x%05x, 0x%05x>", fname, offset, native_offset);
+               else {
+                       char *mvid = mono_guid_to_string_minimal ((uint8_t*)method->klass->image->heap_guid.data);
+                       char *aotid = mono_runtime_get_aotid ();
+                       if (aotid)
+                               res = g_strdup_printf ("at %s [0x%05x] in <%s#%s>:0" , fname, offset, mvid, aotid);
+                       else
+                               res = g_strdup_printf ("at %s [0x%05x] in <%s>:0" , fname, offset, mvid);
+
+                       g_free (aotid);
+                       g_free (mvid);
+               }
                g_free (fname);
                return res;
        }
@@ -844,6 +1045,9 @@ struct _BundledSymfile {
 
 static BundledSymfile *bundled_symfiles = NULL;
 
+/**
+ * mono_register_symfile_for_assembly:
+ */
 void
 mono_register_symfile_for_assembly (const char *assembly_name, const mono_byte *raw_contents, int size)
 {
@@ -875,22 +1079,15 @@ open_symfile_from_bundle (MonoImage *image)
 void
 mono_debugger_lock (void)
 {
-       g_assert (initialized);
-       mono_mutex_lock (&debugger_lock_mutex);
+       g_assert (mono_debug_initialized);
+       mono_os_mutex_lock (&debugger_lock_mutex);
 }
 
 void
 mono_debugger_unlock (void)
 {
-       g_assert (initialized);
-       mono_mutex_unlock (&debugger_lock_mutex);
-}
-
-void
-mono_debugger_initialize ()
-{
-       mono_mutex_init_recursive (&debugger_lock_mutex);
-       initialized = 1;
+       g_assert (mono_debug_initialized);
+       mono_os_mutex_unlock (&debugger_lock_mutex);
 }
 
 /**
@@ -903,3 +1100,12 @@ mono_debug_enabled (void)
 {
        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);
+}