100

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

4

2 回答 2

97

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

于 2010-07-19T19:02:16.937 回答
67

运行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命令。

于 2014-01-02T15:16:38.207 回答