[runtime] Save MonoTrampInfo structures in a list so mono_print_method_from_ip (...
authorZoltan Varga <vargaz@gmail.com>
Wed, 2 Oct 2013 17:20:43 +0000 (13:20 -0400)
committerZoltan Varga <vargaz@gmail.com>
Wed, 2 Oct 2013 17:20:43 +0000 (13:20 -0400)
mono/mini/mini.c
mono/mini/mini.h
mono/mini/xdebug.c

index 04a25569c54f846e8ef601808cf99de4e381e21e..780ff2e714c4ab640bbfdf37bfdcf1fdca457067 100644 (file)
@@ -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)
 {
index 627cb2ae49e498caad8d072547424e80b0eeb510..65da77d3d56c5e3e47aa84ff94f9707160bb9a62 100644 (file)
@@ -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, 
index 517fe8e1d21a000d607c60f9e6159b0635c801bd..1166d803f58cdeaa42c707bbfc7cf18c567dabc1 100644 (file)
@@ -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