C++ 同时具有-static和-rdynamic的回溯_符号()

C++ 同时具有-static和-rdynamic的回溯_符号(),c++,c,symbols,static-linking,backtrace,C++,C,Symbols,Static Linking,Backtrace,查看,我可以看到,要使backtrace_symbols()工作,必须使用-rdynamic标志进行编译 我已经在一个测试程序中尝试过了,它可以工作,但我正在编写一个程序,它也是用-static编译的,并且说backtrace\u symbols()在-static传递给编译器/链接器时不起作用 有没有快速的解决方法,否则我的静态链接程序中就永远不会有一个可读的回溯函数?如果您必须将程序编译为静态的,您仍然可以使用backtrace()查找函数的地址,然后通过解析调试信息,使用,比如说 但这不是

查看,我可以看到,要使
backtrace_symbols()
工作,必须使用
-rdynamic
标志进行编译

我已经在一个测试程序中尝试过了,它可以工作,但我正在编写一个程序,它也是用
-static
编译的,并且说
backtrace\u symbols()
-static
传递给编译器/链接器时不起作用


有没有快速的解决方法,否则我的静态链接程序中就永远不会有一个可读的回溯函数?

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


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

答案已经在手边了:它在。最后,我成功地使用了
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;
}

是的,
-static
在我的程序中是必需的。我也尝试了
libunwind
,但我的示例程序在Ubuntu 12.04 x86和x86\u 64上都没有链接。我总是收到链接错误,例如:
未定义引用到x86\u init\u local
未定义引用到x86\u get\u reg未定义引用到x86\u get\u proc\u name未定义引用到x86\u step,这两种方法都使用二进制Ubuntu libunwind和从Avio下载的最新自编译libunwind。@Avio提到的是
libdwarf
,而不是
libunwind
。我在链接
libunwind
时没有遇到问题,我会尽快尝试
libdwarf
。我刚才提到的是
libunwind
,因为它可能是另一个有趣的选择,没有任何特殊要求。您使用了什么体系结构/发行版?您成功链接到了
libundwind
?@Avio我在X86上使用OpenSUSE 10.x-12.x,但我认为这并不重要,因为您可以在您的平台上编译
libdwarf
。您还需要链接到
libelf
,才能处理ELF二进制文件。
g++ -static unwind.cpp -o unwind -lunwind -lunwind-x86