質問

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 に設定され、ブレークポイントに再度ヒットすることはありません)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top