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

时间:2010-07-19 19:01:08

标签: debugging compilation symbols gimp

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

2 个答案:

答案 0 :(得分:60)

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

答案 1 :(得分:40)

运行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命令在两个调试和非调试情况下返回“未剥离”。但是,内核对象的大小差异显着:

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

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

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