From: Zoltan Varga Date: Wed, 2 Oct 2013 17:20:43 +0000 (-0400) Subject: [runtime] Save MonoTrampInfo structures in a list so mono_print_method_from_ip (... X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=commitdiff_plain;h=3e745070dbcd666f6987aeec009d4f423c454295;p=mono.git [runtime] Save MonoTrampInfo structures in a list so mono_print_method_from_ip () would work on trampolines. --- diff --git a/mono/mini/mini.c b/mono/mini/mini.c index 04a25569c54..780ff2e714c 100644 --- a/mono/mini/mini.c +++ b/mono/mini/mini.c @@ -153,6 +153,8 @@ gboolean disable_vtypes_in_regs = FALSE; gboolean mono_dont_free_global_codeman; +static GSList *tramp_infos; + gpointer mono_realloc_native_code (MonoCompile *cfg) { @@ -382,6 +384,7 @@ mono_print_method_from_ip (void *ip) FindTrampUserData user_data; MonoGenericSharingContext*gsctx; const char *shared_type; + GSList *l; ji = mini_jit_info_table_find (domain, ip, &target_domain); if (!ji) { @@ -394,9 +397,18 @@ mono_print_method_from_ip (void *ip) char *mname = mono_method_full_name (user_data.method, TRUE); printf ("IP %p is a JIT trampoline for %s\n", ip, mname); g_free (mname); + return; } - else - g_print ("No method at %p\n", ip); + for (l = tramp_infos; l; l = l->next) { + MonoTrampInfo *tinfo = l->data; + + if ((guint8*)ip >= tinfo->code && (guint8*)ip <= tinfo->code + tinfo->code_size) { + printf ("IP %p is at offset 0x%x of trampoline '%s'.\n", ip, (int)((guint8*)ip - tinfo->code), tinfo->name); + return; + } + } + + g_print ("No method at %p\n", ip); fflush (stdout); return; } @@ -636,6 +648,26 @@ mono_tramp_info_free (MonoTrampInfo *info) g_free (info); } +/* + * mono_tramp_info_register: + * + * Remember INFO for use by mono_print_method_from_ip (). + */ +void +mono_tramp_info_register (MonoTrampInfo *info) +{ + MonoTrampInfo *copy; + + copy = g_new0 (MonoTrampInfo, 1); + copy->code = info->code; + copy->code_size = info->code_size; + copy->name = g_strdup (info->name); + + mono_loader_lock_if_inited (); + tramp_infos = g_slist_prepend (tramp_infos, copy); + mono_loader_unlock_if_inited (); +} + G_GNUC_UNUSED static void break_count (void) { diff --git a/mono/mini/mini.h b/mono/mini/mini.h index 627cb2ae49e..65da77d3d56 100644 --- a/mono/mini/mini.h +++ b/mono/mini/mini.h @@ -2189,6 +2189,7 @@ void mono_emit_unwind_op (MonoCompile *cfg, int when, int val) MONO_INTERNAL; MonoTrampInfo* mono_tramp_info_create (const char *name, guint8 *code, guint32 code_size, MonoJumpInfo *ji, GSList *unwind_ops) MONO_INTERNAL; void mono_tramp_info_free (MonoTrampInfo *info) MONO_INTERNAL; +void mono_tramp_info_register (MonoTrampInfo *info) MONO_INTERNAL; int mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_bblock, MonoBasicBlock *end_bblock, MonoInst *return_var, GList *dont_inline, MonoInst **inline_args, diff --git a/mono/mini/xdebug.c b/mono/mini/xdebug.c index 517fe8e1d21..1166d803f58 100644 --- a/mono/mini/xdebug.c +++ b/mono/mini/xdebug.c @@ -341,6 +341,8 @@ mono_save_xdebug_info (MonoCompile *cfg) void mono_save_trampoline_xdebug_info (MonoTrampInfo *info) { + mono_tramp_info_register (info); + if (use_gdb_interface) { MonoImageWriter *w; MonoDwarfWriter *dw; @@ -381,6 +383,7 @@ mono_save_xdebug_info (MonoCompile *cfg) void mono_save_trampoline_xdebug_info (MonoTrampInfo *info) { + mono_tramp_info_register (info); } #endif