c - 带有存档文件的 addr2line

标签 c linux debugging objdump addr2line

我正在尝试将 addr2line 与存档文件一起使用 libdpdk.a

我有一个回溯:

backtrace returned: 7
0: 0x46fd05 ./build/ip_pipeline(bt+0x25) [0x46fd05]
1: 0x42a163 ./build/ip_pipeline() [0x42a163]
2: 0x46ff21 ./build/ip_pipeline(rte_eal_init+0x171) [0x46ff21]
3: 0x439629 ./build/ip_pipeline(app_init+0x709) [0x439629]
4: 0x42b3ff ./build/ip_pipeline(main+0x5f) [0x42b3ff]
5: 0x7f101166b830 /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0) [0x7f101166b830]
6: 0x42d009 ./build/ip_pipeline(_start+0x29) [0x42d009]

我尝试了以下命令:

addr2line  0x46fd05 -f -e ../../build/lib/librte_eal.a

addr2line: ../../build/lib/librte_eal.a: cannot get addresses from archive

预期输出 应该是回溯中地址 0x46fd050x46fd05 的函数名称,具体取决于我传递的地址。目前没有与此地址关联的符号名称。

任何建议。

我已经使用 -rdynamic 编译了代码

最佳答案

撇开选择 .a/.so 的原因,'addr2line' 应该与执行的二进制文件一起使用。原因是回溯地址是特定于二进制文件的。

同一个静态(.a)库通常会被加载到不同的二进制文件中的不同地址。这对于“.so”(尤其是与位置无关的代码)是正确的 - 但在许多情况下,Linux 将尝试重用已经映射的“.so”文件,以便实际地址相同。

底线 - 来自手册页 - 使用可执行文件名称。

--exe=filename
           Specify the name of the executable for which addresses should be translated. 
           The default file is a.out.

一些实际注意事项 - 当使用“.so”时 - 你想在具有相同可执行文件、共享对象和 LD_LIBRARY_PATH 的系统上执行 addr2line。如果您的开发和生产中存在不同的“.so”,则地址可能不匹配。

关于c - 带有存档文件的 addr2line,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58364054/

相关文章:

java - 如何在 Netbeans 中调试 Java Web 应用程序?

c++ - 这个函数定义是什么意思?

c - AVL 树递归,函数最小化

c - memmove 中的 "const void*"是什么意思?

iphone - 为 iPhone 模拟器构建时,XCode 控制台中不再有 gdb

c++ - 在 GDB 中隐含此参数

c++ - Visual Studio 2010 错误?

c - 这段代码如何在两个进程之间工作?

linux - 带有 cron 作业的 Shell 脚本在未运行的情况下启动程序?

java - 如何覆盖服务器上的文件