如何检查程序是否使用调试符号编译?

118

我想在GIMP中跟踪一些代码,因此需要启用了调试符号的GIMP。我不记得是否在编译过程中已经启用了它们。如何在不重新编译程序的情况下检查它们?

2个回答

122

在Linux上可以使用fileobjdump。特别地,在我的Ubuntu 20.04.1 LTS上,使用file命令检查一个可执行文件是否使用了-g编译选项,如果没有则显示not stripped,而使用了-g选项则除此之外还会显示with debug_info。同时,还可以通过运行objdump --syms命令来判断输出内容是否有用(对于我而言,一个普通构建的可执行文件会输出“no symbols”)。


13
Stripped 的意思是没有符号,对吗? - Lukasz Czerwinski
29
在OS X中,相应的命令是 otool -Iv - rich.e
10
在使用otool -Iv命令时,需要注意哪些输出内容? - Nitish Upreti
15
是否剥离与构建时是调试版本或发布版本关系不大。你可以拥有一个被剥离的调试版本或未被剥离的发布版本。 - Ronny Andersson
3
看起来那肯定是Debian Stretch。with debug_info出现在file-5.30中,该版本附带于Stretch。因此,另一个选择是查找.debug_info节(objdump -h a.out | grep .debug_info)。 - x-yuri
显示剩余7条评论

79

当运行objdump --syms命令时,我在输出中看到的不仅仅是"no symbols"(至少对于内核对象而言)。

要检查内核对象中是否存在调试信息,您可以在objdump命令的末尾添加以下内容:| grep debug

如果找到了这个字符串,则表示内核对象包含调试信息。如果没有找到,则它是一个“干净”的内核对象。

下面是我编译的一个没有调试信息的内核模块示例:

geertvc@jimi:~/mystuff/kernels/linux-3.12.6$ objdump --syms ./modules/lib/modules/3.12.6/kernel/drivers/i2c/busses/i2c-at91.ko | grep debug

我已经编译了相同的内核模块,并带有调试信息的示例:

geertvc@jimi:~/mystuff/kernels/linux-3.12.6$ objdump --syms ./modules/lib/modules/3.12.6/kernel/drivers/i2c/busses/i2c-at91.ko | grep debug
00000000 l    d  .debug_frame   00000000 .debug_frame
00000000 l    d  .debug_info    00000000 .debug_info
00000000 l    d  .debug_abbrev  00000000 .debug_abbrev
00000000 l    d  .debug_loc     00000000 .debug_loc
00000000 l    d  .debug_aranges 00000000 .debug_aranges
00000000 l    d  .debug_ranges  00000000 .debug_ranges
00000000 l    d  .debug_line    00000000 .debug_line
00000000 l    d  .debug_str     00000000 .debug_str
00000010 l       .debug_frame   00000000 $d

如你所见,第一个输出并没有返回任何内容,而第二个输出返回了其中包含有 debug 的行。

注:在我的情况中,file 命令在调试和非调试情况下都返回了“未剥离”(not stripped)。但是,内核对象大小的差异非常明显:

  • 没有调试信息的大小约为16k
  • 有调试信息的大小约为137k

显然,后者版本中包含了调试信息。

我的问题是:file 命令在这种情况下可靠吗? 根据我的经验,我依赖于 objdump --syms ... | grep debug 命令。


我也遇到了与“file”相同的问题。对于我来说,“objdump --syms”没有“grep”位仍会产生许多结果,即使在非调试构建上也是如此,但是“grep”有助于呼叫特定的仅调试符号,所以这对我很有效。 - pattivacek
5
+1 用于清除“文件”输出中的模糊性 - ADJ
2
在我的Ubuntu 19系统上,file命令会显示“带有debug_info,未剥离”或者只是“已剥离”。 - Nagev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接