web-dev-qa-db-ja.com

プログラムがデバッグシンボルを使用してコンパイルされたかどうかを確認する方法

GIMPでコードをトレースしたいので、デバッグシンボルを有効にしたGIMPが必要です。コンパイル中にそれらを有効にしたかどうかは覚えていません。プログラムを再コンパイルせずにそれを確認する方法は?

64

Linuxではfileおよびobjdumpを使用できます。特に、ファイルが「削除された」か「削除されていない」か、およびobjdump --symsは有用なものをすべて出力します(私にとっては、通常のビルドでは「シンボルなし」と表示されます)。

64

objdump --symsコマンド、出力に「no symbols」よりもはるかに多く表示されます(少なくとも、カーネルオブジェクト)。

カーネルオブジェクト内にデバッグ情報があるかどうかを確認するには、objdumpコマンドの最後に次を追加できます。| grep debug

この文字列が見つかった場合、カーネルオブジェクトにデバッグ情報が含まれていることがわかります。そうでない場合は、「クリーンな」カーネルオブジェクトです。

コンパイルしたカーネルモジュールの例withoutデバッグ情報:

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

私がコンパイルした同じカーネルモジュールの例withデバッグ情報:

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

ご覧のとおり、最初の出力は何も返しませんが、2番目の出力はdebugを含む行を返します。

注:私の場合、fileコマンドはboth debugおよびnon-debugの場合に「ストリップされない」ことを返しました。ただし、カーネルオブジェクトのサイズの違いは顕著でした。

  • 約デバッグ情報なしの16k
  • 約デバッグ情報付き137k

明らかに、後者のバージョンにはデバッグ情報が含まれていました。

私の質問:fileコマンドはそのような場合に信頼性がありますか?私が経験したことから、私はobjdump --syms ... | grep debugコマンド。

42
GeertVc