0

私は C++ のデバッグ手法に不慣れで、デバッグ目的のためだけにコードを追加する方法をよりよく理解しようとしています。

次のようなステートメントを使用すると:

#ifdef _DEBUG
cout << "Output that should only be used in Debugging Mode." << endl;
#endif 

内の cout ステートメントは、常にデバッグ モードの内外で実行されるようです。その行は、デバッグ モードのときにのみ実行する必要があります。それが、実際の目的を誤解しているように見えない限り、これらのタイプの if ステートメントの目的であると私が考えたものです。

CONSTRUCTOR_TRACEまた、誰かがとについて詳しく説明できFUNCTION_TRACEますか? それらは正確には何に使用され、どのように適切に使用できますか?

4

3 に答える 3

2

#ifdef _DEBUGはコンパイル時 (実際には前処理時) の構造であり、デバッガー内でプログラムを実行しているかどうかには関係ありませんが、_DEBUGマクロが定義されているという事実に関係しています。

通常、少なくとも 2 つのビルド オプションのセットがあります。1 つはデバッグ用 (を定義し_DEBUG、いくつかのコンパイラの最適化を無効にし、デバッグ シンボルを生成します)、もう 1 つはリリース用 (を定義せず_DEBUG、関連するすべてのコンパイラの最適化を有効にし、生成しない可能性があります) です。情報をデバッグするか、別のファイルに生成します)。

プログラムを開発するときは、通常、デバッグ構成を使用します。実行可能ファイルをビルドして最終的に展開/日常の使用に実際に使用するときは、#ifdef _DEBUG ... #endifブロックに含まれるコードを含まないリリース構成を使用します。実行可能ファイルがいずれかの構成で生成されると、コンパイル時に定義されたという事実が_DEBUG実行可能ファイルに「石で書かれています」。

そうは言ってもデバッガーが接続されているかどうかを検出するプラットフォーム固有の方法がありますが、通常は、デバッガーが接続されているかどうかに応じてプログラムの動作を変更すると、デバッガーを使用する目的が無効になる可能性があります。


補遺

わかりましたので、完全に理解できるかどうか見てみましょう。したがって、f5 キーを押してデバッグ ビルドを実行すると、この #ifdef _DEBUG 内にあるものはすべて実行され、ctrl + f5 キーを押してリリース モードで実行すると、#ifdef _DEBUG 内のコードは実行されません。自分。私はあなたが言おうとしていることを完全に理解しているとは思いません。できればもう少し簡単に説明してみてください。私は、c++ と Visual Studio 環境についてはそれほど詳しくありません。

C++ でビルド/デバッグ プロセスがどのように行われるかについて、誤解があるようです。を押すと、次F5のことが起こります。

  1. コンパイラが呼び出されます。現在選択されている構成のビルド設定に従って、ファイルをコンパイルし、実行可能ファイルを生成します。1
  2. 実行可能ファイルが実行されます。
  3. VS デバッガーは、新しく作成されたプロセスに接続されます2

Ctrl+を押すF5と、唯一の違いはステップ 3 がスキップされることです。残りはまったく同じです。

さて、いつ_DEBUG登場しますか?実行可能ファイルが生成されるステップ 1 (実際には、ステップ 1 のかなり早い段階、前処理段階)。デバッガーが接続されているかどうかにかかわらず、違いはありません。#ifdef _DEBUGブロックに入れられた命令は、実行可能ファイルから既に書き込まれています (または除外されています)。

ここでの重要なポイントは、F5/ Ctrl+F5とデバッグ/リリース構成は 2 つの直交する設定であるということです。「デバッグ」実行可能ファイルをビルドしてデバッグなしで開始し、「リリース」実行可能ファイルをビルドしてデバッグを開始できます (実際、これは最適化されたビルドでのみ発生する問題をデバッグするためによく行われます)。デバッガーがプログラムに接続されているという事実は、その動作をまったく変更するべきではありません3

繰り返しになりますが、デバッガーを使用して開始するかどうかは、この実行でデバッガーを接続するかどうかに関係し、デバッグ/リリース構成でビルドすることは、実行可能ファイルが実際にどのようにビルドされるかに関係します (デバッグ構成は、より多くの「debug-フレンドリー」設定 -_DEBUGデバッグ コードを有効にする、asserts を有効にする、最適化を無効にする、デバッグ シンボルを有効にするなどのように定義されています。


ノート

  1. 以前のビルドからの再利用可能な出力がある場合、このステップはスキップまたは短縮されます。
  2. 実際には、プロセスはデバッガーが接続された状態で作成されます。これは微妙な問題を引き起こす可能性がありますが、ここでは関係ありません。
  3. 実際には、プロセスが を使用してデバッガーをチェックできるため、デバッガーがその動作を変更する場合がありますがIsDebuggerPresent、通常は上記の理由からそうしたくないでしょう。
于 2013-05-23T01:44:24.723 に答える
1

「デバッグモード」は、あなたが考えていることを意味するとは思いません。_DEBUG通常、デバッグ バージョンをコンパイルするときに定義されます。コンパイル後は、「デバッグ モード」に出入りする方法はありません。後でリリースでコンパイルして実行可能ファイルを上書きできますが、そのバイナリはリリースバージョンになり、「デバッグモード」に入ることができなくなります。

デバッガーを使用してアプリに接続しているかどうか、または「デバッグする」か「実行するだけ」という考え方かどうかは関係ありません。コンパイルした後、それが永遠に定義されている (デバッグモードでコンパイルした場合) か、または定義されていない (そうでない場合) と見なすことができます_DEBUG- 再コンパイルまでです。

于 2013-05-23T01:42:26.017 に答える