diff options
author | Sergei Golubchik <sergii@pisem.net> | 2011-12-11 09:00:12 +0100 |
---|---|---|
committer | Sergei Golubchik <sergii@pisem.net> | 2011-12-11 09:00:12 +0100 |
commit | 37c81d81b3940a21b500aff6aeb70e8b1df0b7e8 (patch) | |
tree | a509017b136b719551fdda6d69470ad5f0b15950 /mysys/stacktrace.c | |
parent | c753bedcb1975b0875e2e9e3c176db37b6becbff (diff) | |
download | mariadb-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.c | 37 |
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 } |