プログラムのブレークポイント/アサートを無効にする方法は?
-
02-07-2019 - |
質問
Visual Studio を使用してネイティブ アプリケーションを開発しており、コード内に __asm int 3 または __debugbreak を使用して配置されたプログラム ブレークポイント (アサート) があります。場合によっては、これをヒットしたときに、同じデバッグ セッションでの連続ヒットがデバッガーに侵入しないように、それを無効にしたいことがあります。これどうやってするの?
解決
x86 / x64
x86/x64 アプリケーションを作成していると仮定して、ウォッチ ウィンドウに次のように記述します。
x86: *(char *)eip,x
x64: *(char *)rip,x
INT 3 のオペコードである値 0xcc が表示されるはずです。これを NOP のオペコードである 0x90 に置き換えます。eip をアドレスとして使用してメモリ ウィンドウを使用することもできます。
PPC
PPC アプリケーションを作成していると仮定します (例:Xbox 360)、ウォッチ ウィンドウに次のように書き込みます。
*(int *)iar,x
トラップのオペコードである値 0xfeNNNNNN が表示されます (ほとんどの場合、0x0fe00016 = 無条件トラップ)。これを NOP のオペコードである 0x60000000 に置き換えます。
他のヒント
次のようなことを試してみるとよいでしょう:
#define ASSERT(x) {\
if (!(x)) \
{ \
static bool ignore = false; \
if (!ignore) \
{ \
ignore = true; \
__asm int 3 \
} \
}\
}
これによりデバッグが実行されるのは 1 回だけです。ユーザーにメッセージボックスを表示して、何をすべきかを尋ねることもできます。continue (何も起こりません)、break (int 3 が呼び出されます)、またはignore (ignore が true に設定され、ブレークポイントに再度ヒットすることはありません)