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; }
Error GDMonoAssembly::wrapper_for_image(MonoImage *p_image) { ERR_FAIL_COND_V(loaded, ERR_FILE_ALREADY_IN_USE); assembly = mono_image_get_assembly(p_image); ERR_FAIL_NULL_V(assembly, FAILED); image = p_image; mono_image_addref(image); loaded = true; return OK; }
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->index = ++next_symbol_file_id; handle->image = image; mono_image_addref (image); handle->image_file = g_strdup (mono_image_get_filename (image)); handle->type_table = create_data_table (NULL); handle->symfile = mono_debug_open_mono_symbols ( handle, raw_contents, size, _mono_debug_using_mono_debugger); mono_debug_list_add (&mono_symbol_table->symbol_files, handle); g_hash_table_insert (mono_debug_handles, image, handle); if (mono_symbol_table->corlib) mono_debugger_event (MONO_DEBUGGER_EVENT_LOAD_MODULE, (guint64) (gsize) handle, 0); mono_debugger_unlock (); return handle; }
MonoPPDBFile* mono_ppdb_load_file (MonoImage *image, const guint8 *raw_contents, int size) { MonoImage *ppdb_image = NULL; const char *filename; char *s, *ppdb_filename; MonoImageOpenStatus status; guint8 pe_guid [16]; gint32 pe_age; gint32 pe_timestamp; if (image->tables [MONO_TABLE_DOCUMENT].rows) { /* Embedded ppdb */ mono_image_addref (image); return create_ppdb_file (image); } if (!get_pe_debug_guid (image, pe_guid, &pe_age, &pe_timestamp)) return NULL; if (raw_contents) { if (size > 4 && strncmp ((char*)raw_contents, "BSJB", 4) == 0) ppdb_image = mono_image_open_from_data_internal ((char*)raw_contents, size, TRUE, &status, FALSE, TRUE, NULL); } else { /* ppdb files drop the .exe/.dll extension */ filename = mono_image_get_filename (image); if (strlen (filename) > 4 && (!strcmp (filename + strlen (filename) - 4, ".exe") || !strcmp (filename + strlen (filename) - 4, ".dll"))) { s = g_strdup (filename); s [strlen (filename) - 4] = '\0'; ppdb_filename = g_strdup_printf ("%s.pdb", s); g_free (s); } else { ppdb_filename = g_strdup_printf ("%s.pdb", filename); } ppdb_image = mono_image_open_metadata_only (ppdb_filename, &status); if (!ppdb_image) g_free (ppdb_filename); } if (!ppdb_image) return NULL; /* * Check that the images match. * The same id is stored in the Debug Directory of the PE file, and in the * #Pdb stream in the ppdb file. */ PdbStreamHeader *pdb_stream = (PdbStreamHeader*)ppdb_image->heap_pdb.data; g_assert (pdb_stream); /* The pdb id is a concentation of the pe guid and the timestamp */ if (memcmp (pe_guid, pdb_stream->guid, 16) != 0 || memcmp (&pe_timestamp, pdb_stream->guid + 16, 4) != 0) { g_warning ("Symbol file %s doesn't match image %s", ppdb_image->name, image->name); mono_image_close (ppdb_image); return NULL; } return create_ppdb_file (ppdb_image); }