summaryrefslogtreecommitdiff
path: root/mysys/stacktrace.c
diff options
context:
space:
mode:
authorSergei Golubchik <sergii@pisem.net>2011-12-11 09:00:12 +0100
committerSergei Golubchik <sergii@pisem.net>2011-12-11 09:00:12 +0100
commit37c81d81b3940a21b500aff6aeb70e8b1df0b7e8 (patch)
treea509017b136b719551fdda6d69470ad5f0b15950 /mysys/stacktrace.c
parentc753bedcb1975b0875e2e9e3c176db37b6becbff (diff)
downloadmariadb-git-37c81d81b3940a21b500aff6aeb70e8b1df0b7e8.tar.gz
another backtrace resolver that prints source file name and line number
Diffstat (limited to 'mysys/stacktrace.c')
-rw-r--r--mysys/stacktrace.c37
1 files changed, 32 insertions, 5 deletions
diff --git a/mysys/stacktrace.c b/mysys/stacktrace.c
index d0897fabb52..a7b71a0bca6 100644
--- a/mysys/stacktrace.c
+++ b/mysys/stacktrace.c
@@ -210,25 +210,52 @@ static void my_demangle_symbols(char **addrs, int n)
#endif /* BACKTRACE_DEMANGLE */
+#if HAVE_MY_ADDR_RESOLVE
+static int print_with_addr_resolve(void **addrs, int n)
+{
+ int i;
+ const char *err;
+
+ if ((err= my_addr_resolve_init()))
+ {
+ fprintf(stderr, "(my_addr_resolve failure: %s)\n", err);
+ return 0;
+ }
+
+ for (i= 0; i < n; i++)
+ {
+ my_addr_loc loc;
+ if (my_addr_resolve(addrs[i], &loc))
+ backtrace_symbols_fd(addrs+i, 1, fileno(stderr));
+ else
+ fprintf(stderr, "%s:%u(%s)[%p]\n",
+ loc.file, loc.line, loc.func, addrs[i]);
+ }
+ return 1;
+}
+#endif
+
void my_print_stacktrace(uchar* stack_bottom, ulong thread_stack)
{
void *addrs[128];
- char **strings= NULL;
+ char **strings __attribute__((unused)) = NULL;
int n = backtrace(addrs, array_elements(addrs));
fprintf(stderr, "stack_bottom = %p thread_stack 0x%lx\n",
stack_bottom, thread_stack);
+#if HAVE_MY_ADDR_RESOLVE
+ if (print_with_addr_resolve(addrs, n))
+ return;
+#endif
#if BACKTRACE_DEMANGLE
if ((strings= backtrace_symbols(addrs, n)))
{
my_demangle_symbols(strings, n);
free(strings);
+ return;
}
#endif
#if HAVE_BACKTRACE_SYMBOLS_FD
- if (!strings)
- {
- backtrace_symbols_fd(addrs, n, fileno(stderr));
- }
+ backtrace_symbols_fd(addrs, n, fileno(stderr));
#endif
}