1. ホーム
  2. gcc

[解決済み] デバッグオプション -g はバイナリ実行ファイルをどのように変更するのですか?

2023-08-15 02:58:42

質問

C/C++のコードを書くとき、バイナリ実行ファイルをデバッグするために、コンパイラ/リンカでデバッグオプションを有効にする必要があります。 GCCの場合、そのオプションは-gです。 デバッグ・オプションが有効なとき、バイナリ実行ファイルにどのような影響を与えますか? デバッガを機能させるために、ファイルにどのような追加データが格納されているのでしょうか?

どのように解決するのですか。

-g は、実行ファイルにシンボルテーブル情報を保存するようコンパイラに指示します。 とりわけ、これは以下を含みます。

  • シンボル名
  • シンボルの型情報
  • シンボルの元となったファイルと行番号

デバッガはこの情報を使って、シンボルに意味のある名前を出力したり、命令をソースの特定の行と関連付けたりします。

一部のコンパイラでは、-g を指定すると、特定の最適化が無効になります。たとえば、icc では、明示的に -O[123] を指定しない限り、-g を指定するとデフォルトの最適化レベルが -O0 に設定されます。 また、-O[123] を指定しても、スタック・トレースを防止する最適化は無効になります (例: スタック・フレームからフレーム・ポインタを取り除くなど)。 これはパフォーマンスにわずかな影響を与えるだけです)。

いくつかのコンパイラーでは、-g は、シンボルがどこから来たのか混乱させるような最適化 (命令の並べ替え、ループのアンローリング、インライン化など) を無効化します。 最適化でデバッグしたい場合、gcc で -g3 を使用すると、この一部を回避することができます。 マクロ、拡張、およびインライン化された可能性のある関数に関する追加のデバッグ情報が含まれます。これにより、デバッガやパフォーマンス・ツールが最適化されたコードを元のソースにマップすることができますが、これは最善の努力です。 一部の最適化では、コードを本当にこじらせてしまいます。

より詳細な情報は DWARF は、もともと ELF (Linux やその他の OS 用のバイナリ形式) と共に設計されたデバッグ用フォーマットです。