Gcc valgrind stacktrace中缺少符号

Gcc valgrind stacktrace中缺少符号,gcc,linker,valgrind,elf,debug-symbols,Gcc,Linker,Valgrind,Elf,Debug Symbols,我使用valgrind调试一个二进制文件,它通过dlopen使用可加载库。 在debian stable上,stacktrace不包含可加载库中调用的符号 | | ->11.55% (114,688B) 0x769492C: ??? | | | ->11.55% (114,688B) 0x7697289: ??? | | | ->11.55% (114,688B) 0x769806F: ??? | | | ->11.55% (114,688B) 0x41981

我使用valgrind调试一个二进制文件,它通过dlopen使用可加载库。 在debian stable上,stacktrace不包含可加载库中调用的符号

| | ->11.55% (114,688B) 0x769492C: ???
| | | ->11.55% (114,688B) 0x7697289: ???
| | |   ->11.55% (114,688B) 0x769806F: ???
| | |     ->11.55% (114,688B) 0x419812: myfunc (main.c:1010)
debian不稳定上的Valgrind运行良好,符号已正确解析。所以我开始寻找不同之处。 我在两个系统上都有这些软件包(valgrind从不稳定更新为3.7):

LIB未剥离,包含调试信息:

 ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=0x33ffd210859178c15bb3923c5491e1a1b6065015, not stripped
仔细看,我注意到库的大小不同,在debian上,库稍微大一点。与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
这让我觉得debian stable上构建的二进制文件中的调试信息部分缺少了一些东西。现在我的问题是:为什么二进制文件有什么不同?构建中使用的工具(gcc、libtool、binutils)是相同的,包括编译器/链接器标志和命令(我在make的输出中使用diff进行了检查)

更新: debug_info部分大小的差异源于这样一个事实:源文件的完整路径也存储在那里,并且构建主目录不同。另外,在不稳定/稳定版本上也有不同的openssl版本,它们在debug_info部分添加了一些不同的符号。因此,调试信息大小不同

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

--19837-- Reading syms from /usr/lib/myplugin.so (0x6c62000)

如果您正在为可加载库使用
dlopen
,则它很可能在程序终止之前被卸载。因此,Valgrind无法解析其符号。尽量避免在此库上调用
dlclose
。有关更多信息,请参阅。

Make的输出有什么不同?有没有可能是stable上的二进制文件被部分剥离了?我不确定在这种情况下
文件
会显示什么,但是
strip
有很多选项,包括(我相信)只剥离调试信息的功能。make的输出没有区别,除了基本路径(不同的主目录)。脱衣舞没有被叫来。调试部分在两个版本中都有,只是一些版本的大小不同。该死,现在我记得我在一年多前遇到过这个问题。我甚至为此设置了一个配置选项来禁用cleanup,该选项调用dlclose,而这在有问题的机器上并没有设置。另一方面,它已启用。谢谢你的提醒!如果您无法更改正在调试的二进制文件,并且仍然需要.so中的符号供valgrind查看,请使用LD_PRELOAD=/path/to/lib.so从valgrind 3.14开始,您可以添加选项
--keep debuginfo=yes
,以解决此问题。
--19837-- Reading syms from /usr/lib/myplugin.so (0x6c62000)