如何检查程序是不是使用调试符号编译? [复制]

Posted

技术标签:

【中文标题】如何检查程序是不是使用调试符号编译? [复制]【英文标题】:How to check if program was compiled with debug symbols? [duplicate]如何检查程序是否使用调试符号编译? [复制] 【发布时间】:2011-03-18 01:56:19 【问题描述】:

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

【问题讨论】:

【参考方案1】:

您可以在 Linux 上使用 fileobjdump。特别是,您可以查看文件是否显示“已剥离”或“未剥离”(在我的Ubuntu 20.04.1 LTS 下,是否使用-g 编译可执行文件会显示not stripped 和@987654327 @ 命令。但是带有-g 的那个,除此之外还显示with debug_info,),以及objdump --syms 是否输出任何有用的东西(对我来说,它表示常规构建的“无符号”)。

【讨论】:

剥离意味着没有符号,对吧? OS X 的等价物是otool -Iv 在 otool -Iv 的输出中寻找什么? 剥离与否与是否内置调试或发布无关。您可以有一个已剥离的调试版本或未剥离的发布版本。 嗯,那一定是 Debian Stretch。 with debug_info 出现在 file-5.30 中,带有 Stretch。所以另一种选择是寻找.debug_info部分(objdump -h a.out | grep .debug_info)。【参考方案2】:

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

如您所见,第一个输出不返回任何内容,而第二个输出返回包含debug 的行。

注意:在我的情况下,file 命令在 调试和非调试情况下都返回“未剥离”。然而,内核对象的大小差异是显着的:

大约。 16k 没有调试信息 大约。 137k 带调试信息

很明显,后一个版本里面有调试信息。

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

【讨论】:

file 也有同样的问题。对我来说,没有grep 位的objdump --syms 即使在非调试版本中也会产生很多结果,但grep 有助于调出特定的调试符号,所以这对我有用。 +one 用于清除“文件”输出中的模糊性 在我的 Ubuntu 19 系统上,file 表示“使用 debug_info,未剥离”或只是“剥离”。

以上是关于如何检查程序是不是使用调试符号编译? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何检查 DLL 是不是经过调试编译 [重复]

如何告诉 clang 将调试符号放入可执行二进制文件中? [复制]

在 x86 上使用 GDB 而不调试符号?

如何判断一个库是不是是用 -g 编译的?

即使使用 -g 标志编译,gdb 中也没有调试符号

GDB如何调试没有符号表(未加-g选项的编译)的程序