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