[coop] Switch to GC SAFE for backtrace() and backtrace_symbols()
authorAleksey Kliger <aleksey@xamarin.com>
Tue, 27 Sep 2016 21:42:46 +0000 (17:42 -0400)
committerAleksey Kliger <aleksey@xamarin.com>
Thu, 6 Oct 2016 17:54:39 +0000 (13:54 -0400)
Fixes [#42271](https://bugzilla.xamarin.com/show_bug.cgi?id=42271)

mono/metadata/exception.c
mono/metadata/mempool.c
mono/mini/mini-exceptions.c

index 02b738556c597c72fbc7ed9fe76a5acead5d97eb..b4be09844ac59ec3c482c2bb27d7620acacd7cc4 100644 (file)
@@ -976,8 +976,12 @@ mono_exception_get_native_backtrace (MonoException *exc)
        domain = mono_domain_get ();
        len = mono_array_length (arr);
        text = g_string_new_len (NULL, len * 20);
-       messages = backtrace_symbols (mono_array_addr (arr, gpointer, 0), len);
-
+       uint32_t gchandle = mono_gchandle_new (&arr->obj, TRUE); /* pinned */
+       void* addr = mono_array_addr (arr, gpointer, 0);
+       MONO_ENTER_GC_SAFE;
+       messages = backtrace_symbols (addr, len);
+       MONO_EXIT_GC_SAFE;
+       mono_gchandle_free (gchandle);
 
        for (i = 0; i < len; ++i) {
                gpointer ip = mono_array_get (arr, gpointer, i);
index 2706ec6662b974ff39c98f87a82625cbea23c1f5..35754c6d06910f9db86167e24d55179d966eda9f 100644 (file)
@@ -210,8 +210,10 @@ mono_backtrace (int size)
 
         mono_os_mutex_lock (&mempool_tracing_lock);
         g_print ("Allocating %d bytes\n", size);
+       MONO_ENTER_GC_SAFE;
         symbols = backtrace (array, BACKTRACE_DEPTH);
         names = backtrace_symbols (array, symbols);
+       MONO_EXIT_GC_SAFE;
         for (i = 1; i < symbols; ++i) {
                 g_print ("\t%s\n", names [i]);
         }
index fa24b73f186132b30eb3d4b358664d3f59e2d4f6..903739445c1a86806640ce725f856958421865f6 100644 (file)
@@ -1290,7 +1290,10 @@ build_native_trace (MonoError *error)
 #if defined (HAVE_BACKTRACE_SYMBOLS) && defined (TARGET_ARM)
        MonoArray *res;
        void *native_trace [MAX_UNMANAGED_BACKTRACE];
-       int size = backtrace (native_trace, MAX_UNMANAGED_BACKTRACE);
+       int size = -1;
+       MONO_ENTER_GC_SAFE;
+       size = backtrace (native_trace, MAX_UNMANAGED_BACKTRACE);
+       MONO_EXIT_GC_SAFE;
        int i;
 
        if (!size)