如何禁用编程断点/断言?

17

我正在使用Visual Studio开发本地应用程序,我的代码中使用__asm int 3或__debugbreak放置了一个编程断点(assert)。有时当我命中它时,我希望将其禁用,以便在同一调试会话期间连续命中不再中断到调试器。我该如何做?

2个回答

37

x86 / x64

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

x86:*(char *)eip,x

x64:*(char *)rip,x

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

PPC

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

*(int *)iar,x

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


在Win32上,您可能需要将代码段设置为可写。不过,这是一个很好的答案! - Nils Pipenbrinck
1
我正在Win32上进行此操作,从未遇到过任何代码段可写性问题。您能详细说明一些吗?我很乐意将任何更多的细节纳入答案中,以使其更好。 - Suma

4
你可以尝试这样做:
#define ASSERT(x) {\
   if (!(x)) \
   { \
      static bool ignore = false; \
      if (!ignore) \
      { \
         ignore = true; \
         __asm int 3 \
      } \
   }\
}

这应该只会在调试时触发一次。甚至可以向用户显示一个消息框并询问要做什么:继续(什么也不发生),断点(int 3被调用)或忽略(ignore设置为true,断点不再被触发)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接