6

質問が説明するように、プログラムがデバッガーに接続されている場合にのみ実行されるデバッグ コードを追加したいと思います。これflagまたはpre-processor変数は、コンパイラごとに異なると思います...

私の場合、C++ で Microsoft Visual Studio 2010 を使用しています。

また、Ubuntu 10.4 を実行している自宅の別のコンピューターと C++ で Eclipse を使用しています。

4

4 に答える 4

4

この質問は、次の 2 つのうちの 1 つを意味する可能性があります。

  1. ビルド構成に基づいてのみ実行されるコード(リリースとデバッグなど)
  2. デバッガーが接続されている場合にのみ実行されるコード

ビルド構成に基づく

これは、コンパイラに関連するプリプロセッサ マクロを使用することで解決できます (例: Win32 CRT の _DEBUG )。

デバッガーが接続されているかどうかに基づく

これは、いくつかの異なる方法で解決できます。

グローバルブール変数

私が見つけた1つの方法は、次のように初期化されるグローバルブール変数を定義することですfalse:

bool gDebug = false;

デバッガーでコードにアタッチしたら、コードを中断し、[ウォッチ]gDebugウィンドウでオーバーライドします。次に、これが true に設定されている場合に条件付きで実行されるコードを追加できます。true

if (gDebug)
{
    // Debugger is attached, so run this code
    // ...
}

レジストリ キー

DWORDに初期化されるレジストリ値を定義しますが、レジストリ エディタ0を介してオーバーライドできます。1

次に、このレジストリ値が に設定されていることを条件としてデバッグ コードを作成します。1. これは、適切なタイミングでグローバル変数を設定するためにデバッガーを中断することなく、この値を外部から制御できるため、より良い代替手段となる場合があります。

于 2010-11-16T23:20:41.780 に答える
2

デバッグ/リリース ビルドにコードを含めたり含めたりしたくない場合、通常、_DEBUGプリプロセッサ マクロはデバッグ ビルド用に定義されます (少なくとも、慣例である MSVC++ CRT では) が、デバッガがアタッチされているかどうかは検出されません。デバッグ/リリース ビルド用に別のコードを含めるだけです。

アタッチされたデバッガーのランタイム チェックが必要な場合は、ユーザー モード デバッガーがアタッチされているかどうかを検出するIsDebuggerPresent API を使用する必要があります。

100% 信頼できるわけではないことに注意してください。それほど難しくない作業では、デバッガーがアプリケーションに嘘をつく可能性があるからです。言い換えれば、セキュリティ/アンチチート保護やこの種のものには適していません。デバッガーへの追加のヘルプを有効にするためのものです (たとえば、ページ自体が言うように、OutputDeubgStringでより多くの診断情報を出力するなど)。さらに、とにかくやりたいことを何でもできるカーネルモードのデバッガーを検出しません。

とにかく、この関数を複雑なものに使用することは避けることをお勧めします。これは、デバッガーがアタッチされているときに異なるコード パスを導入することになり、「奇妙な」バグのデバッグが非常に困難になる可能性があるためです。私が間接的に使用した、そのような動作を示すすべてのコード (たとえば、ほとんど文書化されていない Windows デバッグ ヒープ) は、常にひどい頭痛の種でした。

于 2010-11-16T23:26:09.830 に答える
0

これにはさらに直接的なアプローチがあります。デバッガー セッション中に、選択した関数を手動で呼び出すことができます:
http://sourceware.org/gdb/onlinedocs/gdb/Calling.html

よろしく、
マルシン

于 2010-11-17T18:40:38.303 に答える
0

プログラムでグローバル変数in_debuggerを設定falseします。この変数が であることで、すべてのデバッグ専用コードを調整しますtruetrueデバッガーをアタッチするときに、変数を に設定します。

于 2010-11-16T23:19:03.827 に答える