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

Luk*_*ski 68 debugging symbols compilation gimp

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

Mat*_*hen 71

您可以在Linux上使用fileobjdump.特别是,您可以查看文件是否"剥离"或"未剥离",以及objdump --syms输出是否有用(对于我来说,它对于常规构建说"没有符号").

  • OS X的等价物是`otool -Iv`. (22认同)
  • 在otool -Iv的输出中要查找什么? (8认同)
  • 如果它是在调试或发布中构建的,剥离与否与之无关.您可以使用剥离的调试版本或未剥离的版本版本. (6认同)
  • 剥离意味着没有符号,对吧? (5认同)
  • 好吧,毕竟那一定是 Debian Stretch。`with debug_info` 出现在 [`file-5.30`](https://github.com/file/file/blob/FILE5_30/src/readelf.c#L1379) 中,它与 Stretch 一起提供。因此,另一种选择是查找 `.debug_info` 部分(`objdump -h a.out | grep .debug_info`)。 (3认同)
  • “file my_binary”和“file my_binary_debug”显示相同的信息,都是“not stripped”。 (2认同)

Gee*_*tVc 43

运行objdump --syms命令时,我在输出中看到的不是" 无符号 "(至少对于内核对象).

要检查内核对象中是否有调试信息,可以在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
Run Code Online (Sandbox Code Playgroud)

使用调试信息编译的相同内核模块的示例:

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
Run Code Online (Sandbox Code Playgroud)

如您所见,第一个输出不返回任何内容,而第二个输出返回其中的行debug.

注意:在我的情况下,该file命令在调试和非调试的情况下返回"未剥离" .但是,内核对象的大小差异显着:

  • 约.16k没有调试信息
  • 约.137k带有调试信息

显然,后一版本内部有调试信息.

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

  • +一个用于清除“文件”输出中的模糊性 (2认同)
  • 在我的 Ubuntu 19 系统上,“file”显示“带有 debug_info,未剥离”或只是“剥离”。 (2认同)