17

Visual Studio を使用してネイティブ アプリケーションを開発しています。コードに __asm int 3 または __debugbreak を使用して配置されたプログラム ブレークポイント (アサート) があります。ヒットしたときに、同じデバッグセッションでの連続したヒットがデバッガーに侵入しないように、それを無効にしたい場合があります。これどうやってするの?

4

2 に答える 2

33

x86 / x64

x86/x64 アプリケーションを作成していると仮定すると、ウォッチ ウィンドウに次のように記述します。

x86:*(char *)eip,x

x64:*(char *)rip,x

INT 3 のオペコードである値 0xcc が表示されます。これを NOP のオペコードである 0x90 に置き換えます。eip をアドレスとしてメモリ ウィンドウを使用することもできます。

クリック課金制

PPC アプリケーション (Xbox 360 など) を作成していると仮定すると、ウォッチ ウィンドウに次のように記述します。

*(int *)iar,x

値 0xfeNNNNNN が表示されるはずです。これはトラップのオペコードです (ほとんどの場合、0x0fe00016 = 無条件トラップ)。これを NOP のオペコードである 0x60000000 に置き換えます。

于 2008-09-22T14:43:45.483 に答える
4

次のようなことを試してみてください:

#define ASSERT(x) {\
   if (!(x)) \
   { \
      static bool ignore = false; \
      if (!ignore) \
      { \
         ignore = true; \
         __asm int 3 \
      } \
   }\
}

これにより、デバッグが 1 回だけヒットするはずです。ユーザーにメッセージ ボックスを表示して、何をすべきかを尋ねることもできます: continue (何も起こらない)、break (int 3 が呼び出される)、または無視 (ignore が true に設定され、ブレークポイントは二度とヒットしません)。

于 2011-06-03T14:40:55.803 に答える