2012-05-08 5 views
3

http://google-glog.googlecode.com/svn/trunk/doc/glog.htmlデバッグモードw.r.t C++とは何ですか?ここから

デバッグモードのサポート
特別「デバッグモード」のログマクロは、デバッグモードでのみ効果を有し、コンパイル非デバッグモードのために何も離れてコンパイルされます。

「デバッグモード」とはw.r.tのC++プログラムとは何ですか?

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

+1

どのコンパイラ? g ++では、コマンドラインで-gを使用してデバッグモードを有効にします。それが実行されると、デバッグモードになります。スイッチでコンパイルされていないプログラムでGDBを起動することはできますが、私はあなたが "デバッグモード"と呼んでいるとは思わないでしょう。 (そして、ブレークポイントの設定などの作業はできません) –

+1

この質問を表示したいと思います:http://stackoverflow.com/questions/2290509/debug-vs-ndebug :) – LihO

答えて

5

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

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

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

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

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

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

5

"デバッグモード"は多くのものを参照できますが、この場合はNDEBUGマクロが定義されていないコンパイルを指します。あなたは(強調鉱山)にリンクされているページから:

DFATALの重症度は、デバッグモード(すなわち、定義されたNDEBUGマクロがありません)で致命的なエラーを記録しますが、自動的にによって生産のプログラムを停止回避します重大度をERRORに減らします。

4

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

正規のデバッグモードフラグはマクロNDEBUGです。定義されている場合は、ではなく、デバッグモードではです。 (それはより明確にPRODUCTIONと命名されるかもしれませんが、悲しいことに、それがそうでないものの観点から名前が付けられています)。

NDEBUGは標準で古代です。これは<cassert>ヘッダーによって使用されます。これは<assert.h>として知られています。その正式な機能は、assertマクロをノーオペレーションにすることですが、通常は境界と要件をチェックする点でC++標準ライブラリにも影響します。

たとえば、g++ -DNDEBUG myProg.cpp -o myProgは、デバッグに関連する実行時機能を使用せずにコンパイルする必要があります。

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

+0

パフォーマンスがisn問題ではなく、通常、生産コードでもNDEBUGを定義しないことです。 –

関連する問題