From 24ec24deb793becd62c895746ffef5cb6ac04521 Mon Sep 17 00:00:00 2001 From: Rodrigo Kumpera Date: Fri, 20 Jul 2012 13:18:34 -0300 Subject: [PATCH] Add new mono_exception_get_native_backtrace function that stringify the native backstace with managed and native frames. --- mono/metadata/exception.c | 43 ++++++++++++++++++++++++++++++++++++++++ mono/metadata/object-internals.h | 3 +++ 2 files changed, 46 insertions(+) diff --git a/mono/metadata/exception.c b/mono/metadata/exception.c index ee10668e20d..e3ba90d69d7 100644 --- a/mono/metadata/exception.c +++ b/mono/metadata/exception.c @@ -15,8 +15,13 @@ #include #include #include +#include #include +#ifdef HAVE_EXECINFO_H +#include +#endif + /** * mono_exception_from_name: * @image: the Mono image where to look for the class @@ -760,3 +765,41 @@ mono_get_exception_runtime_wrapped (MonoObject *wrapped_exception) MONO_OBJECT_SETREF (ex, wrapped_exception, wrapped_exception); return (MonoException*)ex; } + +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); + messages = backtrace_symbols (mono_array_addr (arr, gpointer, 0), len); + + + for (i = 0; i < len; ++i) { + gpointer ip = mono_array_get (arr, gpointer, i); + MonoJitInfo *ji = mono_jit_info_table_find (mono_domain_get (), ip); + if (ji) { + char *msg = mono_debug_print_stack_frame (ji->method, (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]); + } + } + + free (messages); + return g_string_free (text, FALSE); +#else + return g_strdup (""); +#endif +} + diff --git a/mono/metadata/object-internals.h b/mono/metadata/object-internals.h index 8f00e448b60..920eb465f9d 100644 --- a/mono/metadata/object-internals.h +++ b/mono/metadata/object-internals.h @@ -1545,6 +1545,9 @@ mono_object_new_pinned (MonoDomain *domain, MonoClass *klass) MONO_INTERNAL; void mono_field_static_get_value_for_thread (MonoInternalThread *thread, MonoVTable *vt, MonoClassField *field, void *value) MONO_INTERNAL; +char * +mono_exception_get_native_backtrace (MonoException *exc) MONO_INTERNAL; + #endif /* __MONO_OBJECT_INTERNALS_H__ */ -- 2.11.4.GIT