17

我正在使用 Visual Studio 开发本机应用程序,我在使用 __asm int 3 或 __debugbreak 放置的代码中有一个程序断点(断言)。有时当我点击它时,我想禁用它,以便同一调试会话中的连续点击不再闯入调试器。我怎样才能做到这一点?

4

2 回答 2

33

x86 / x64

假设您正在编写 x86/x64 应用程序,请在监视窗口中编写以下内容:

x86:*(char *)eip,x

x64:*(char *)rip,x

您应该看到一个值 0xcc,它是 INT 3 的操作码。将其替换为 0x90,它是 NOP 的操作码。您还可以使用带有 eip 作为地址的内存窗口。

每次点击付费

假设您正在编写 PPC 应用程序(例如 Xbox 360),请在您的监视窗口中写入以下内容:

*(int *)iar,x

您应该看到一个值 0xfeNNNNNN,它是陷阱的操作码(通常是 0x0fe00016 = 无条件陷阱)。将其替换为 0x60000000,它是 NOP 的操作码。

于 2008-09-22T14:43:45.483 回答
4

你可以尝试这样的事情:

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

这应该只触发一次调试。您甚至可以向用户显示一个消息框并询问该做什么:继续(什么都没有发生)、中断(调用 int 3)或忽略(忽略设置为 true,断点不再命中)

于 2011-06-03T14:40:55.803 回答