带有-static和-rdynamic的backtrace_symbols()

Avi*_*vio 10 c c++ symbols backtrace static-linking

看看这个问题这个问题,我可以看到,为了backtrace_symbols()工作,必须用-rdynamic旗子编译.

我试过它变成一个测试程序和它的作品,但我正在写也与编译的程序-static这个页面说,backtrace_symbols()当不工作-static被传递到编译器/连接.

有没有快速的解决方法,或者我的静态链接程序中永远不会有人类可读的回溯功能?

Avi*_*vio 8

答案就在眼前:它出现在我在问题中链接的同一页面中.最后,我成功使用了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;
}
Run Code Online (Sandbox Code Playgroud)

我得到链接错误,因为我(再次)忘记在命令行的末尾放置链接器选项.我真的不明白为什么g++/ gcc忽略命令行选项时至少发出警告.要编译的正确命令行是(-g不需要):

g++ -static unwind.cpp -o unwind -lunwind -lunwind-x86
Run Code Online (Sandbox Code Playgroud)