GccまたはClangを使用してCソースコードをコンパイルするときは、常に-g
フラグを使用してgdbのデバッグ情報を生成します。
gcc -g -o helloworld helloworld.c
代わりに-g3
を推奨する人がいることに気付きました。 -g
フラグと-g3
フラグの違いは何ですか? -g
と-ggdb
にも違いはありますか?
docs から:
-g
オペレーティングシステムのネイティブ形式(スタブ、COFF、XCOFF、またはDWARF 2)でデバッグ情報を生成します。 GDBはこのデバッグ情報を処理できます。スタブ形式を使用するほとんどのシステムでは、-gを使用すると、GDBのみが使用できる追加のデバッグ情報を使用できます。この追加情報により、GDBでのデバッグ作業が向上しますが、他のデバッガーがクラッシュしたり、プログラムの読み取りを拒否したりする可能性があります。追加情報を生成するかどうかを確実に制御する場合は、-gstabs +、-gstabs、-gxcoff +、-gxcoff、または-gvmsを使用します(以下を参照)。
...
-ggdb
GDBで使用するデバッグ情報を生成します。これは、可能な限りGDB拡張機能を含め、利用可能な最も表現力のある形式(DWARF 2、スタブ、またはどちらもサポートされていない場合はネイティブ形式)を使用することを意味します。
-gvmslevel
デバッグ情報を要求し、レベルを使用して情報量を指定します。デフォルトのレベルは2です。レベル0は、デバッグ情報をまったく生成しません。したがって、-g0は-gを無効にします。
....
レベル3には、プログラムに存在するすべてのマクロ定義などの追加情報が含まれます。 -g3を使用すると、一部のデバッガーはマクロ展開をサポートします。
tl; dr:特定の質問に答えるために、-g3
"にはマクロ定義などの追加情報が含まれます。一部のデバッガーは、使用時にマクロ展開をサポートします-g3
"、-g
にはこの追加情報は含まれません。
より広い答えは、gccは-g0
(デバッグ情報が無効)から-g3
(最大デバッグ情報)までの4つのレベルのデバッグ情報をサポートするということです。
-g
を指定することは、-g2
と同等です。不思議なことに、 gcc docs-g
/-g2
が含む情報または除外する情報についてはほとんど述べていません。
デバッグ情報を要求し、レベルを使用して情報量を指定します。デフォルトのレベルは2です。レベル0は、デバッグ情報をまったく生成しません。したがって、-g0は-gを無効にします。
レベル1は、デバッグする予定のないプログラムの一部でバックトレースを作成するのに十分な最小限の情報を生成します。これには、関数と外部変数の説明、および行番号テーブルが含まれますが、ローカル変数に関する情報は含まれません。
レベル3には、プログラムに存在するすべてのマクロ定義などの追加情報が含まれます。 -g3を使用すると、一部のデバッガーはマクロ展開をサポートします。