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