带有-static和-rdynamic的backtrace_symbols()

时间:2012-11-09 12:09:25

标签: c++ c symbols static-linking backtrace

查看this questionthis question我可以看到backtrace_symbols()工作,必须使用-rdynamic标记进行编译。

我已经尝试了它进入测试程序并且它可以工作,但是我正在编写一个也使用-staticthis page编译的程序,说backtrace_symbols()不起作用当-static传递给编译器/链接器时。

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

2 个答案:

答案 0 :(得分:8)

答案就在眼前:它在the same page I linked in the question。最后,我成功使用了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;
}

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

g++ -static unwind.cpp -o unwind -lunwind -lunwind-x86

答案 1 :(得分:3)

如果您必须将程序编译为静态,您仍然可以使用backtrace()查找函数的地址,然后通过使用libdwarf解析调试信息来查找函数名称。

但这不是一项简单的任务,所以我建议使用-rdynamic标志。