15

Apples GCCは実行可能ファイル内にDWARFをどこに/どのように保存しますか?

gcc -gdwarf-2(Apples GCC)を介してバイナリをコンパイルしました。ただし、デバッグ情報objdump -gobjdump -h表示されません。

また、libbfdはデバッグ情報を検出しません。(私はbinutils-mailinglistでそれについてここで尋ねました。)

dsymutilただし、 (dSYMに)を介してデバッグ情報を抽出することはできます。libbfdは、それらのデバッグ情報を読み取ることもできます。

4

4 に答える 4

56

Mac OS Xではid、プログラムをリンクするときに、リンカーがすべてのデバッグ情報を処理しないようにするという決定がありました。多くの場合、デバッグ情報は10xプログラム実行可能ファイルのサイズであるため、リンカーにすべてのデバッグ情報を処理させ、実行可能バイナリに含めることは、リンク時間に重大な悪影響を及ぼしました。反復型開発(コンパイル、リンク、コンパイル、リンク、デバッグ、コンパイルリンク)の場合、これは大きなヒットでした。

代わりに、コンパイラDWARFは.sファイルにデバッグ情報を生成し、アセンブラはそれを.oファイルに出力します。リンカは、実行可能バイナリに「デバッグマップ」を含め、デバッグ情報ユーザーにすべてのシンボルが再配置された場所を通知します。リンク。

コンシューマー(.o-fileデバッグを実行)は、実行可能ファイルからデバッグマップをロードし、必要に応じて.oファイル内のすべてのDWARFを処理し、デバッグマップの指示に従ってシンボルを再マッピングします。

dsymutilデバッグ情報リンカーと考えることができます。これと同じプロセスを実行します(デバッグマップを読み取り、.oファイルからDWARFをロードし、すべてのアドレスを再配置します)。次に、すべてのDWARFの単一のバイナリを最終的なリンクされたアドレスに出力します。これはdSYMバンドルです。

dSYMバンドルを入手すると、すべてのドワーフ読み取りツール(Mach-Oバイナリファイルを処理できる)が処理できる、昔ながらの標準DWARFが手に入ります。

このすべてを機能させる追加の改良点があります。UUIDはMach-Oバイナリに含まれています。リンカがバイナリを作成するたびに、LC_UUIDロードコマンド(v。otool -hlvまたはdwarfdump --uuid)で128ビットのUUIDを出力します。これにより、そのバイナリファイルが一意に識別されます。dSYMdsymutilを作成すると、そのUUIDが含まれます。デバッガーは、一致するUUIDがある場合にのみ、dSYMと実行可能ファイルを関連付けます。危険なファイルのmodタイムスタンプなどはありません。

UUIDを使用して、バイナリのdSYMを見つけることもできます。mdfind "com_apple_xcode_dsym_uuids == E21A4165-29D5-35DC-D08D-368476F85EE1" それらはクラッシュレポートに表示されます。たとえば、dSYMがSpotlightのインデックス付きの場所にある場合など、それらを検索するために使用できるSpotlightインポーターが含まれてい ます。会社のdSYMのリポジトリと、UUID(おそらく小さなmysqlデータベースなど)を指定して正しいdSYMを取得できるプログラムを作成することもできます。そのため、ランダムな実行可能ファイルでデバッガーを実行すると、すべてのデバッグが即座に実行されます。その実行可能ファイルの情報。UUIDを使用して実行できる非常に優れたことがいくつかあります。

しかし、とにかく、元の質問に答えるために:ストリップされていないバイナリにはデバッグマップがあり、.oファイルにはDWARFがあり、dsymutil実行されると、これらが組み合わされてdSYMバンドルが作成されます。

デバッグマップエントリを表示したい場合は、実行nm -pa executableしてください。すべてがそこにあります。それらは古いスタブnlistレコードの形式です-リンカーはスタブの処理方法をすでに知っているので、それらを使用するのが最も簡単でした-しかし、それがどのように機能するかはそれほど問題なくわかります。不明な場合は、いくつかのスタブドキュメントを参照してください。 。

于 2012-10-10T20:05:23.203 に答える
2

実際にはそうではないようです。

トレースdsymutilすると、すべてのファイルが読み取られ*.oます。objdump -hまた、それらのすべてのデバッグ情報を一覧表示します。

したがって、これらの情報はバイナリにコピーされていないようです。


これに関するいくつかの関連コメントもここにあります。

于 2012-04-06T16:32:18.747 に答える
2

OSXがデバッグ情報を配置する方法は2つあるようです。

  1. コンパイルに使用される.oオブジェクトファイル内。バイナリは、これらのファイルへの参照を(絶対パスで)格納します。

  2. .dSYMと呼ばれる別のバンドル(ディレクトリ)

を使用してAppleのClangでコンパイルするとg++ -g main.cpp -o foo、というバンドルが表示されfoo.dSYMます。ただし、CMakeを使用すると、オブジェクトファイルでデバッグ情報を取得します。gcc -c main.cpp -o main.oそれは別のステップを行うので、私は推測しますか?

とにかく、このコマンドはケース1で非常に便利であることがわかりました。

$ dsymutil -dump-debug-map main
---
triple:          'x86_64-apple-darwin'
binary-path:     main
objects:         
  - filename:        /Users/tim/foo/build/CMakeFiles/main.dir/main.cpp.o
    timestamp:       1485951213
    symbols:         
      - { sym: __ZNSt3__111char_traitsIcE11eq_int_typeEii, objAddr: 0x0000000000000D50, binAddr: 0x0000000100001C90, size: 0x00000020 }
      - { sym: __ZNSt3__111char_traitsIcE6lengthEPKc, objAddr: 0x0000000000000660, binAddr: 0x00000001000015A0, size: 0x00000020 }
      - { sym: GCC_except_table3, objAddr: 0x0000000000000DBC, binAddr: 0x0000000100001E2C, size: 0x00000000 }
      - { sym: _main, objAddr: 0x0000000000000000, binAddr: 0x0000000100000F40, size: 0x00000090 }
      - { sym: __ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m, objAddr: 0x00000000000001F0, binAddr: 0x0000000100001130, size: 0x00000470 }
      - { sym: ___clang_call_terminate, objAddr: 0x0000000000000D40, binAddr: 0x0000000100001C80, size: 0x00000010 }
      - { sym: GCC_except_table5, objAddr: 0x0000000000000E6C, binAddr: 0x0000000100001EDC, size: 0x00000000 }
      - { sym: __ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4_, objAddr: 0x0000000000000680, binAddr: 0x00000001000015C0, size: 0x000006C0 }
      - { sym: __ZNSt3__14endlIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_, objAddr: 0x00000000000000E0, binAddr: 0x0000000100001020, size: 0x00000110 }
      - { sym: GCC_except_table2, objAddr: 0x0000000000000D7C, binAddr: 0x0000000100001DEC, size: 0x00000000 }
      - { sym: __ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc, objAddr: 0x0000000000000090, binAddr: 0x0000000100000FD0, size: 0x00000050 }
      - { sym: __ZNSt3__111char_traitsIcE3eofEv, objAddr: 0x0000000000000D70, binAddr: 0x0000000100001CB0, size: 0x0000000B }
...
于 2017-02-01T12:20:28.173 に答える
-1

Appleは、デバッグ情報を*.dSYMという名前の個別のファイルに保存します。これらのファイルに対してdwarfdumpを実行して、DWARFデバッグ情報エントリを確認できます。

于 2012-04-14T14:31:25.473 に答える