static gboolean append_frame_and_continue (MonoMethod *method, gpointer ip, size_t native_offset, gboolean managed, gpointer user_data) { MonoDomain *domain = mono_domain_get (); GString *text = (GString*)user_data; if (method) { char *msg = mono_debug_print_stack_frame (method, native_offset, domain); g_string_append_printf (text, "%s\n", msg); g_free (msg); } else { g_string_append_printf (text, "<unknown native frame 0x%x>\n", ip); } return FALSE; }
char * mono_exception_handle_get_native_backtrace (MonoExceptionHandle exc) { #ifdef HAVE_BACKTRACE_SYMBOLS MonoDomain *domain; MonoArrayHandle arr = MONO_HANDLE_NEW(MonoArray, NULL); int i, len; GString *text; char **messages; MONO_HANDLE_GET (arr, exc, native_trace_ips); if (MONO_HANDLE_IS_NULL(arr)) return g_strdup (""); domain = mono_domain_get (); len = mono_array_handle_length (arr); text = g_string_new_len (NULL, len * 20); uint32_t gchandle; gpointer *addr = MONO_ARRAY_HANDLE_PIN (arr, gpointer, 0, &gchandle); MONO_ENTER_GC_SAFE; messages = backtrace_symbols (addr, len); MONO_EXIT_GC_SAFE; mono_gchandle_free_internal (gchandle); for (i = 0; i < len; ++i) { gpointer ip; MONO_HANDLE_ARRAY_GETVAL (ip, arr, gpointer, i); MonoJitInfo *ji = mono_jit_info_table_find (domain, ip); if (ji) { char *msg = mono_debug_print_stack_frame (mono_jit_info_get_method (ji), (char*)ip - (char*)ji->code_start, domain); g_string_append_printf (text, "%s\n", msg); g_free (msg); } else { g_string_append_printf (text, "%s\n", messages [i]); } } g_free (messages); return g_string_free (text, FALSE); #else return g_strdup (""); #endif }
char * mono_exception_get_native_backtrace (MonoException *exc) { #ifdef HAVE_BACKTRACE_SYMBOLS MonoDomain *domain; MonoArray *arr = exc->native_trace_ips; int i, len; GString *text; char **messages; if (!arr) return g_strdup (""); domain = mono_domain_get (); len = mono_array_length (arr); text = g_string_new_len (NULL, len * 20); 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); MonoJitInfo *ji = mono_jit_info_table_find (mono_domain_get (), (char *)ip); if (ji) { char *msg = mono_debug_print_stack_frame (mono_jit_info_get_method (ji), (char*)ip - (char*)ji->code_start, domain); g_string_append_printf (text, "%s\n", msg); g_free (msg); } else { g_string_append_printf (text, "%s\n", messages [i]); } } g_free (messages); return g_string_free (text, FALSE); #else return g_strdup (""); #endif }