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

Debugging 如何检查程序是否使用调试符号编译?,debugging,compilation,symbols,gimp,Debugging,Compilation,Symbols,Gimp,我想在GIMP中跟踪一些代码,因此需要启用调试符号的GIMP。我不记得在编译期间是否启用了它们。如何在不重新编译程序的情况下进行检查?您可以在Linux上使用文件和objdump。特别是,您可以查看文件是否显示“已剥离”或“未剥离”(在我的Ubuntu 20.04.1 LTS下,是否使用-g编译可执行文件显示未剥离,使用文件命令。但是使用-g的文件显示带有调试信息,),以及objdump--syms是否输出有用的内容(对我来说,对于常规构建,它表示“无符号”)当运行objdump--syms命令

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

您可以在Linux上使用
文件
objdump
。特别是,您可以查看文件是否显示“已剥离”或“未剥离”(在我的
Ubuntu 20.04.1 LTS
下,是否使用
-g
编译可执行文件显示
未剥离
,使用
文件
命令。但是使用
-g
的文件显示
带有调试信息,
),以及
objdump--syms
是否输出有用的内容(对我来说,对于常规构建,它表示“无符号”)

当运行
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
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
使用调试信息编译的同一内核模块的示例:

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
的行

注意:在我的例子中,
文件
命令在调试和非调试案例中都返回我“未剥离”。但是,内核对象的大小差异非常显著:

  • 约16k,无调试信息
  • 约137k,带有调试信息
显然,后一个版本中有调试信息

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

剥离意味着没有符号,对吗?OS X的等价物是
otool-Iv
。在otool-Iv的输出中寻找什么?剥离与否与它是否内置于调试或发布中没有多大关系。您可以有一个剥离的调试版本,也可以有一个未剥离的发布版本。好吧,这毕竟是Debian的延伸<带有调试信息的代码>出现在中,它与拉伸一起出现。因此,另一个选择是查找
.debug\u info
部分(
objdump-ha.out | grep.debug\u info
)。我对
文件也有同样的问题。对我来说,
objdump--syms
不带
grep
位即使在非调试版本上也会产生很多结果,但是
grep
有助于调用特定的只调试的符号,所以这对我来说很有用。+在我的Ubuntu19系统上清除“文件”输出中的模糊性,
文件
说“带调试信息,而不是剥离”或者只是“剥离”。