質問が説明するように、プログラムがデバッガーに接続されている場合にのみ実行されるデバッグ コードを追加したいと思います。これflag
またはpre-processor
変数は、コンパイラごとに異なると思います...
私の場合、C++ で Microsoft Visual Studio 2010 を使用しています。
また、Ubuntu 10.4 を実行している自宅の別のコンピューターと C++ で Eclipse を使用しています。
質問が説明するように、プログラムがデバッガーに接続されている場合にのみ実行されるデバッグ コードを追加したいと思います。これflag
またはpre-processor
変数は、コンパイラごとに異なると思います...
私の場合、C++ で Microsoft Visual Studio 2010 を使用しています。
また、Ubuntu 10.4 を実行している自宅の別のコンピューターと C++ で Eclipse を使用しています。
この質問は、次の 2 つのうちの 1 つを意味する可能性があります。
これは、コンパイラに関連するプリプロセッサ マクロを使用することで解決できます (例: Win32 CRT の _DEBUG )。
これは、いくつかの異なる方法で解決できます。
グローバルブール変数
私が見つけた1つの方法は、次のように初期化されるグローバルブール変数を定義することですfalse
:
bool gDebug = false;
デバッガーでコードにアタッチしたら、コードを中断し、[ウォッチ]gDebug
ウィンドウでオーバーライドします。次に、これが true に設定されている場合に条件付きで実行されるコードを追加できます。true
if (gDebug)
{
// Debugger is attached, so run this code
// ...
}
レジストリ キー
DWORD
に初期化されるレジストリ値を定義しますが、レジストリ エディタ0
を介してオーバーライドできます。1
次に、このレジストリ値が に設定されていることを条件としてデバッグ コードを作成します。1.
これは、適切なタイミングでグローバル変数を設定するためにデバッガーを中断することなく、この値を外部から制御できるため、より良い代替手段となる場合があります。
デバッグ/リリース ビルドにコードを含めたり含めたりしたくない場合、通常、_DEBUG
プリプロセッサ マクロはデバッグ ビルド用に定義されます (少なくとも、慣例である MSVC++ CRT では) が、デバッガがアタッチされているかどうかは検出されません。デバッグ/リリース ビルド用に別のコードを含めるだけです。
アタッチされたデバッガーのランタイム チェックが必要な場合は、ユーザー モード デバッガーがアタッチされているかどうかを検出するIsDebuggerPresent API を使用する必要があります。
100% 信頼できるわけではないことに注意してください。それほど難しくない作業では、デバッガーがアプリケーションに嘘をつく可能性があるからです。言い換えれば、セキュリティ/アンチチート保護やこの種のものには適していません。デバッガーへの追加のヘルプを有効にするためのものです (たとえば、ページ自体が言うように、OutputDeubgStringでより多くの診断情報を出力するなど)。さらに、とにかくやりたいことを何でもできるカーネルモードのデバッガーを検出しません。
とにかく、この関数を複雑なものに使用することは避けることをお勧めします。これは、デバッガーがアタッチされているときに異なるコード パスを導入することになり、「奇妙な」バグのデバッグが非常に困難になる可能性があるためです。私が間接的に使用した、そのような動作を示すすべてのコード (たとえば、ほとんど文書化されていない Windows デバッグ ヒープ) は、常にひどい頭痛の種でした。
これにはさらに直接的なアプローチがあります。デバッガー セッション中に、選択した関数を手動で呼び出すことができます:
http://sourceware.org/gdb/onlinedocs/gdb/Calling.html
よろしく、
マルシン
プログラムでグローバル変数in_debugger
を設定false
します。この変数が であることで、すべてのデバッグ専用コードを調整しますtrue
。true
デバッガーをアタッチするときに、変数を に設定します。