c プログラムのコンパイル中に -g オプションを使用するよう求める gdb に関する多くのチュートリアルを目にします。-g オプションが実際に何をするのか理解できません。
1 に答える
これにより、コンパイラは結果のバイナリにデバッグ情報を追加します。この情報により、デバッガーはコード内の命令をソース コード ファイルおよび行番号に関連付けることができます。デバッグ シンボルを使用すると、特定の種類のデバッグ (コードのステップ実行など) が非常に簡単になります。
この-g
オプションには、実際にはいくつかの調整可能なパラメーターがあります。マニュアルを確認してください。また、コードを最適化しない場合に最も役立ちます。そのため、-O0
または-Og
(新しいバージョンでは) - 最適化を使用すると、命令とソース コードの間の接続が切断されます。(最も重要なことは、関数呼び出しからフレーム ポインターを省略しないことです。これは一般的な最適化ですが、基本的に呼び出しスタックをたどる機能を完全に台無しにします。)
デバッグ シンボル自体は標準化された言語 (DWARF2 だと思います) で記述されており、それを読み取るためのライブラリがあります。たとえば、プログラムは実行時に独自のデバッグ シンボルを読み取ることさえできます。
デバッグ シンボル (および関数名などの他の種類のシンボル) は、後でstrip
コマンドを使用してバイナリから削除できます。ただし、通常はデバッグ シンボルを最適化されていないビルドと組み合わせることになるため、あまり意味がありません。むしろ、さまざまな最適化を行い、最初からシンボルを使用せずにリリース バイナリをビルドします。
MSVC などの他のコンパイラは、バイナリ自体にデバッグ情報を含めず、別のファイルや「シンボル サーバー」に格納します。したがって、ホーム ユーザーのアプリケーションがクラッシュしてコア ダンプを取得した場合は、次のことができます。サーバーからシンボルを取得し、読み取り可能なスタック トレースを取得します。GCC は将来、そのような機能を追加する可能性があります。私はそれについていくつかの議論を見てきました。