backtrace_symbols() 与 -static 和 -rdynamic

Posted

技术标签:

【中文标题】backtrace_symbols() 与 -static 和 -rdynamic【英文标题】:backtrace_symbols() with both -static and -rdynamic 【发布时间】:2012-10-29 18:11:30 【问题描述】:

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

我已经在测试程序中尝试过它并且它可以工作,但是我正在编写一个也用-static 和this page 编译的程序说backtrace_symbols() 在通过-static 时不起作用到编译器/链接器。

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

【问题讨论】:

【参考方案1】:

答案就在眼前:在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

【讨论】:

【参考方案2】:

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

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

【讨论】:

是的,-static 在我的程序中是强制性的。我也尝试使用libunwind,但我的示例程序在 Ubuntu 12.04 x86 和 x86_64 上都没有链接。我总是遇到链接错误,例如:undefined reference to _Ux86_init_local undefined reference to _Ux86_get_reg undefined reference to _Ux86_get_proc_name undefined reference to _Ux86_step 都使用二进制 Ubuntu libunwind 和从 here 下载的最新自编译 libunwind。 @Avio 我提到了libdwarf,而不是libunwind。我与libunwind链接没有问题 我会尽快尝试libdwarf。我只是提到libunwind,因为它可能是另一个有趣的替代方案,没有任何特殊要求。成功链接到libunwind 后,您使用了什么架构/发行版? @Avio 我在 X86 上使用 OpenSUSE 10.x-12.x,但我认为这并不重要,因为您可以在您的平台上编译 libdwarf。您还需要链接到 libelf 才能处理 ELF 二进制文件。

以上是关于backtrace_symbols() 与 -static 和 -rdynamic的主要内容,如果未能解决你的问题,请参考以下文章

Linux下打印调用堆栈

ST表与树状数组

PostGIS的ST_Azimuth函数中几何与地理的区别

ST-LINK/V2是怎么和STM32单片机连接的

提高篇:RMQ问题与ST表

请教一个菜鸟问题.ST-LINK/V2 能在IAR下使用吗