1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-30 16:24:05 +03:00

another backtrace resolver that prints source file name and line number

This commit is contained in:
Sergei Golubchik
2011-12-11 09:00:12 +01:00
parent c753bedcb1
commit 37c81d81b3
7 changed files with 189 additions and 6 deletions

View File

@ -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
}