Looking at this question and this question I can see that for backtrace_symbols()
to work, one must compile with the -rdynamic
flag.
I've tried it into a test program and it works, but I'm writing a program that is also compiled with -static
and this page says that backtrace_symbols()
doesn't work when -static
is passed to the compiler/linker.
Is there any quick workaround to this or I'll never have a human-readable backtrace function in my statically linked program?
The answer was already at hand: it was in the same page I linked in the question. At the end, I successfully used libunwind
.
#include <libunwind.h>
#include <stdio.h>
void do_backtrace()
{
unw_cursor_t cursor;
unw_context_t context;
unw_getcontext(&context);
unw_init_local(&cursor, &context);
while (unw_step(&cursor) > 0)
{
unw_word_t offset, pc;
char fname[64];
unw_get_reg(&cursor, UNW_REG_IP, &pc);
fname[0] = '\0';
(void) unw_get_proc_name(&cursor, fname, sizeof(fname), &offset);
printf ("%p : (%s+0x%x) [%p]\n", pc, fname, offset, pc);
}
}
int main()
{
do_backtrace();
return 0;
}
I was getting linking errors because I was (again) forgotting to place linker options at the end of the command line. I really don't understand why g++
/gcc
don't issue at least a warning when ignoring command line options. The correct command line to compile is (-g
isn't needed):
g++ -static unwind.cpp -o unwind -lunwind -lunwind-x86
If you absolutely have to compile your program as static, you can still use backtrace()
to find out addresses of the functions and then find function names by parsing debug information, using libdwarf, for example.
But it isn't a simple task, so I'd suggest to use -rdynamic
flag.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With