static MonoDebugHandle * mono_debug_open_image (MonoImage *image, const guint8 *raw_contents, int size) { MonoDebugHandle *handle; if (mono_image_is_dynamic (image)) return NULL; mono_debugger_lock (); handle = mono_debug_get_image (image); if (handle != NULL) { mono_debugger_unlock (); return handle; } handle = g_new0 (MonoDebugHandle, 1); handle->image = image; mono_image_addref (image); /* 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); mono_debugger_unlock (); return handle; }
/** * mono_debug_close_image: */ void mono_debug_close_image (MonoImage *image) { MonoDebugHandle *handle; if (!mono_debug_initialized) return; mono_debugger_lock (); handle = mono_debug_get_image (image); if (!handle) { mono_debugger_unlock (); return; } g_hash_table_remove (mono_debug_handles, image); mono_debugger_unlock (); }
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; mono_debugger_lock (); 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); else ptr = oldptr = buffer; write_leb128 (jit->prologue_end, ptr, &ptr); write_leb128 (jit->epilogue_begin, ptr, &ptr); write_leb128 (jit->num_line_numbers, ptr, &ptr); for (i = 0; i < jit->num_line_numbers; i++) { MonoDebugLineNumberEntry *lne = &jit->line_numbers [i]; 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); } size = ptr - oldptr; g_assert (size < max_size); total_size = size + sizeof (MonoDebugMethodAddress); if (method_is_dynamic (method)) { address = g_malloc0 (total_size); } else { address = mono_mempool_alloc (table->mp, total_size); } address->code_start = jit->code_start; address->code_size = jit->code_size; memcpy (&address->data, oldptr, size); if (max_size > BUFSIZ) g_free (oldptr); g_hash_table_insert (table->method_address_hash, method, address); mono_debugger_unlock (); return address; }