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