4

ここから:http://google-glog.googlecode.com/svn/trunk/doc/glog.html

デバッグモードのサポート
特別な「デバッグモード」ログマクロは、デバッグモードでのみ効果があり、非デバッグモードのコンパイルでは何もコンパイルされません。

「デバッグモード」とは、C ++プログラムとはどういう意味ですか?

プログラムでGDBを使用しているときに、プログラムがデバッグモードになっていると言えますか?

4

3 に答える 3

5

「デバッグモード」は多くのことを指しますが、この場合はNDEBUGマクロを定義せずにコンパイルすることを指します。リンクしたページから(私の強調):

DFATAL重大度は、デバッグモードでFATALエラーをログに記録します(つまり、NDEBUGマクロが定義されていません)が、重大度を自動的にERRORに下げることにより、実動中のプログラムの停止を回避します。

于 2012-05-08T08:17:51.347 に答える
5

「デバッグモード」には3つの側面があります。

多くのライブラリ(標準ライブラリを含む)は、デバッグモードでコンパイルされるときに、デバッグ支援コード(配列境界チェック、不変アサーションなど)を挿入します。パフォーマンスを向上させるために、本番/非デバッグモードでこれらのチェックを削除します。

コンパイラにはデバッグスイッチがあります。ライブラリがデバッグ用にコンパイルしているかどうかを検出し、生成されたバイナリにデバッグシンボルを挿入するために使用するデバッグマクロを設定します。これは、デバッガーが実行中のバイナリコードとそれを生成したソースコードの間のリンクを作成するのに役立ちます。

デバッガーでプログラムを実行することは、「ランタイムデバッグモード」です。実行可能ファイルは、デバッグ用に作成されているかどうかに関係なく、デバッガーで実行できます。デバッグビルドでより多くの情報を得ることができます。

これらの3つの「デバッグモード」はすべて独立しています。コンパイラにデバッグシンボルの出力を要求せずに、適切なマクロ/定義を手動で設定することにより、(通常)本番ビルドでライブラリデバッグチェックをコンパイルできます。

これはいずれもC++(またはC)に固有のものではありません。他の多くの言語にはこれらの概念があります。

于 2012-05-08T08:19:54.997 に答える
4

C ++プログラム(Cなど)は通常、コマンドラインから渡すことができるプリプロセッサマクロに基づいて異なるビルド構成を持っています。

正規のデバッグモードフラグはマクロNDEBUGです。これは、定義されている場合、デバッグモードになっていないことを意味します。(もっと明確に名前を付けることもできますPRODUCTIONが、残念ながら、そうでないものという観点から名前が付けられています。)

NDEBUG標準であり、古代です。<cassert>これは、Cで知られているヘッダーによって使用され<assert.h>ます。その公式の機能は、assertマクロをno-opにすることですが、通常、境界と要件のチェックに関してC++標準ライブラリにも影響します。

たとえば、g++ -DNDEBUG myProg.cpp -o myProgデバッグに関連するランタイム機能なしでコンパイルする必要があります。

-gこれは、GCCで制御されるデバッガーのシンボリックサポート、または他のプラットフォームの他のフラグを生成することとは異なることに注意してください。

于 2012-05-08T08:18:02.183 に答える