2009-02-25 Zoltan Varga <vargaz@gmail.com>
authorZoltan Varga <vargaz@gmail.com>
Wed, 25 Feb 2009 04:43:09 +0000 (04:43 -0000)
committerZoltan Varga <vargaz@gmail.com>
Wed, 25 Feb 2009 04:43:09 +0000 (04:43 -0000)
* mini-exceptions.c (mono_handle_native_sigsegv): Implement the
suspend-on-sigsegv functionality.

* mini.c (mini_parse_debug_options): Add a new 'suspend-on-sigsegv' option
to suspend when a native SIGSEGV is received. This is useful for debugging
crashes which don't happen under gdb, since a live process contains more
information than a core file.

* mini-exceptions.c (mono_print_thread_dump): Use
MONO_ARCH_HAVE_SIGCTX_TO_MONOCTX instead of platform defines.

* mini-x86.h (MONO_ARCH_HAVE_SIGCTX_TO_MONOCTX): New define.

* mini-amd64.h (MONO_ARCH_HAVE_SIGCTX_TO_MONOCTX): Ditto.

svn path=/trunk/mono/; revision=127942

mono/mini/ChangeLog
mono/mini/mini-exceptions.c
mono/mini/mini-x86.h
mono/mini/mini.c
mono/mini/mini.h

index 8ee23ab4ed3e44a6c6acc2e843839edf2980c5a5..fda6841d751ce41c9e470ed08a7fa8f1e09a3c82 100644 (file)
@@ -1,5 +1,20 @@
 2009-02-25  Zoltan Varga  <vargaz@gmail.com>
 
+       * mini-exceptions.c (mono_handle_native_sigsegv): Implement the
+       suspend-on-sigsegv functionality.
+
+       * mini.c (mini_parse_debug_options): Add a new 'suspend-on-sigsegv' option
+       to suspend when a native SIGSEGV is received. This is useful for debugging
+       crashes which don't happen under gdb, since a live process contains more
+       information than a core file.
+
+       * mini-exceptions.c (mono_print_thread_dump): Use 
+       MONO_ARCH_HAVE_SIGCTX_TO_MONOCTX instead of platform defines.
+
+       * mini-x86.h (MONO_ARCH_HAVE_SIGCTX_TO_MONOCTX): New define.
+
+       * mini-amd64.h (MONO_ARCH_HAVE_SIGCTX_TO_MONOCTX): Ditto.
+       
        * basic-float.cs: Disable the tests which currently fail on amd64.
 
        * tramp-amd64.c (mono_arch_nullify_class_init_trampoline): Pass a non-null 
index 85a21fe576c8074f4187695b68642abacf56e5b7..5b57cda36b1a9372c92247b577c779f5f7d53872 100644 (file)
@@ -1409,6 +1409,12 @@ mono_handle_native_sigsegv (int signal, void *ctx)
        if (handling_sigsegv)
                return;
 
+       if (mini_get_debug_options ()->suspend_on_sigsegv) {
+               fprintf (stderr, "Received SIGSEGV, suspending...");
+               while (1)
+                       ;
+       }
+
        /* To prevent infinite loops when the stack walk causes a crash */
        handling_sigsegv = TRUE;
 
@@ -1568,8 +1574,7 @@ mono_print_thread_dump (void *sigctx)
        free (wapi_desc);
 #endif
 
-       /* FIXME: */
-#if defined(__i386__) || defined(__x86_64__)
+#ifdef MONO_ARCH_HAVE_SIGCTX_TO_MONOCTX
        if (!sigctx)
                MONO_INIT_CONTEXT_FROM_FUNC (&ctx, mono_print_thread_dump);
        else
index 631ff0de89d99b56f2f2f526e8bb84e77cf26c6c..26716415bc8a750105115fe7bb790e1da4fcead0 100644 (file)
@@ -288,6 +288,7 @@ typedef struct {
 #define MONO_ARCH_HAVE_GENERALIZED_IMT_THUNK 1
 #define MONO_ARCH_HAVE_LIVERANGE_OPS 1
 #define MONO_ARCH_HAVE_XP_UNWIND 1
+#define MONO_ARCH_HAVE_SIGCTX_TO_MONOCTX 1
 #if defined(__linux__) && !defined(HAVE_MOVING_COLLECTOR)
 #define MONO_ARCH_MONITOR_OBJECT_REG X86_EAX
 #endif
index 32c740986933a57595ffa1510a895995f53fdecd..55230a02ced904a4597ee972263d4427a231466e 100644 (file)
@@ -4355,11 +4355,13 @@ mini_parse_debug_options (void)
                        debug_options.break_on_unverified = TRUE;
                else if (!strcmp (arg, "no-gdb-backtrace"))
                        debug_options.no_gdb_backtrace = TRUE;
+               else if (!strcmp (arg, "suspend-on-sigsegv"))
+                       debug_options.suspend_on_sigsegv = TRUE;
                else if (!strcmp (arg, "dont-free-domains"))
                        mono_dont_free_domains = TRUE;
                else {
                        fprintf (stderr, "Invalid option for the MONO_DEBUG env variable: %s\n", arg);
-                       fprintf (stderr, "Available options: 'handle-sigint', 'keep-delegates', 'collect-pagefault-stats', 'break-on-unverified', 'no-gdb-backtrace', 'dont-free-domains'\n");
+                       fprintf (stderr, "Available options: 'handle-sigint', 'keep-delegates', 'collect-pagefault-stats', 'break-on-unverified', 'no-gdb-backtrace', 'dont-free-domains', 'suspend-on-sigsegv'\n");
                        exit (1);
                }
        }
index 5e41d05272eac276cc83181db2110baf596e3078..0860f7eae2bb46a5e39756ea16e06af325adf09a 100644 (file)
@@ -1121,6 +1121,7 @@ typedef struct {
        gboolean better_cast_details;
        gboolean mdb_optimizations;
        gboolean no_gdb_backtrace;
+       gboolean suspend_on_sigsegv;
 } MonoDebugOptions;
 
 enum {