سؤال

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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top