valgrind stacktrace中缺少符号

b0t*_*0ti 2 linker gcc valgrind elf debug-symbols

我正在使用valgrind来调试通过dlopen使用可加载库的二进制文件.在debian stable上,stacktrace不包含可加载lib内调用的符号.

| | ->11.55% (114,688B) 0x769492C: ???
| | | ->11.55% (114,688B) 0x7697289: ???
| | |   ->11.55% (114,688B) 0x769806F: ???
| | |     ->11.55% (114,688B) 0x419812: myfunc (main.c:1010)
Run Code Online (Sandbox Code Playgroud)

关于debian unstable的Valgrind工作正常,符号得到妥善解决.所以我开始寻找与众不同的东西.我在两个系统上都有这些软件包(valgrind从unstable更新为3.7):

ii  valgrind                      1:3.7.0-1+b1
ii  libtool                       2.2.6b-2
ii  gcc                           4:4.4.5-1
ii  binutils                      2.20.1-16
Run Code Online (Sandbox Code Playgroud)

libs不会被剥离并包含debuginfo:

 ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=0x33ffd210859178c15bb3923c5491e1a1b6065015, not stripped
Run Code Online (Sandbox Code Playgroud)

仔细观察我注意到库的大小不同,在debian不稳定的情况下,lib稍微大些.将它们与readelf进行比较,调试信息的大小更大.

  [26] .debug_aranges    PROGBITS        0000000000000000 00a74c 000090 00      0   0  1
  [27] .debug_pubnames   PROGBITS        0000000000000000 00a7dc 000385 00      0   0  1
  [28] .debug_info       PROGBITS        0000000000000000 00ab61 00512f 00      0   0  1
  [29] .debug_abbrev     PROGBITS        0000000000000000 00fc90 0006e2 00      0   0  1
  [30] .debug_line       PROGBITS        0000000000000000 010372 002314 00      0   0  1
  [31] .debug_str        PROGBITS        0000000000000000 012686 0019d3 01  MS  0   0  1
  [32] .debug_loc        PROGBITS        0000000000000000 014059 000f24 00      0   0  1
  [33] .debug_macinfo    PROGBITS        0000000000000000 014f7d 179082 00      0   0  1
  [34] .debug_ranges     PROGBITS        0000000000000000 18dfff 000060 00      0   0  1
Run Code Online (Sandbox Code Playgroud)

这让我觉得在debian stable上构建的二进制文件的调试信息部分中缺少某些东西.现在我的问题是:为什么以及二进制文件有何不同?构建中使用的工具(gcc,libtool,binutils)是相同的,包括编译器/链接器标志和命令(我在make的输出上检查了diff).

更新: debug_info节大小差异来自于源文件的完整路径也存储在那里,并且构建主页不同.在unstable/stable上还有不同的openssl版本,它们为debug_info部分添加了一些不同的符号.因此debug_info大小的差异.

在调试模式下运行valgrind(-d -v -v)表明它在两种情况下都从可加载的lib中读取符号:

--19837-- Reading syms from /usr/lib/myplugin.so (0x6c62000)
Run Code Online (Sandbox Code Playgroud)

ks1*_*322 8

如果您正在使用dlopen可加载库,则可能是在程序终止之前卸载了它.因此Valgrind无法解析其符号.尽量避免调用dlclose此库.有关更多信息,请参阅http://valgrind.org/docs/manual/faq.html#faq.unhelpful.

  • 如果您无法更改正在调试的二进制文件,并且仍希望valgrind看到.so中的符号,请使用LD_PRELOAD =/path/to/lib.so (5认同)
  • 从 valgrind 3.14 开始,您可以添加选项 `--keep-debuginfo=yes` 来修复此问题。 (3认同)