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);
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]);
}
#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)