【问题标题】:How to disable a programmatical breakpoint / assert?如何禁用程序断点/断言?
【发布时间】:2008-09-22 14:43:25
【问题描述】:

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

【问题讨论】:

    标签: visual-studio debugging x86 assert debugbreak


    【解决方案1】:

    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 上,您可能必须使您的代码段可写。不过答案很好!
    • 我在 Win32 上执行此操作,我从未见过任何代码段可写性问题。你能详细说明一下吗?我很乐意在答案中加入更多细节以使其更好。
    • 看来我对x64的无知已经暴露了。 :) 我现在会记得 x86/x64 的许多操作码是相同的。谢谢。
    【解决方案2】:

    你可以试试这样的:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多