GCC -g vs -g3 GDBフラグ:違いは何ですか?


102

CソースコードをgccまたはClangでコンパイルするときは、常に-gフラグを使用してgdbのデバッグ情報を生成します。

gcc -g -o helloworld helloworld.c

-g3代わりに推奨する人もいることに気づきました。-g-g3フラグの違いは何ですか?また、との違いは-gあり-ggdbますか?


15
他の誰かのメイクファイルを使っているので、ここに来ました。googleから簡単な答えを見つけるためにStackOverflowに投稿する良い質問です。
GreenAsJade 2015

SOに関する圧倒的な数の質問は、十分に掘り下げようとする限り、「ドキュメントをカバー」されます。それは質問を却下する正当な理由ではありません。
BeeOnRope 2018年

回答:


104

ドキュメントから:

-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を使用すると、一部のデバッガーはマクロ展開をサポートします。


8
たとえば、「最も表現力豊かな形式」と「追加情報」の違いは何ですか?これらのパラメーターは補完的ですか?それらの多くはGDBについて言及しています...ありがとう!
rogerdpack 2015

28

tl; dr:特定の質問に答えるために、-g3「マクロ定義などの追加情報が含まれています...一部のデバッガーは-g3、使用時にマクロ展開をサポートします-gが、この追加情報は含まれていません。

より広い答えは、gccは-g0(デバッグ情報が無効)から-g3(最大デバッグ情報)までの4つのレベルのデバッグ情報をサポートするということです。

指定すること-gはと同等-g2です。不思議なことに、gccのドキュメントでは、どの情報が含まれている-g/ -g2含まれていないかについてほとんど何も言われていません。

デバッグ情報を要求し、levelを使用して情報量を指定します。デフォルトのレベルは2です。レベル0はデバッグ情報をまったく生成しません。したがって、-g0は-gを無効にします。

レベル1は、デバッグする予定のないプログラムの部分でバックトレースを作成するのに十分な最小限の情報を生成します。これには、関数と外部変数の説明、および行番号テーブルが含まれますが、ローカル変数に関する情報は含まれません。

レベル3には、プログラムに存在するすべてのマクロ定義などの追加情報が含まれます。-g3を使用すると、一部のデバッガーはマクロ展開をサポートします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.