Gcc valgrind stacktrace中缺少符号
我使用valgrind调试一个二进制文件,它通过dlopen使用可加载库。 在debian stable上,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
| | ->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)