为什么我在 64 位机器上调试 32 位应用程序时得到 STATUS_WX86_BREAKPOINT 而不是 EXCEPTION_BREAKPOINT?

Why do I get STATUS_WX86_BREAKPOINT instead of EXCEPTION_BREAKPOINT when debugging 32 bit application on 64 machine?

我正在尝试在 Windows 上编写一个简单的调试器来调试 32 位应用程序,我的机器是 64 位的。我用的是C语言

当我在指定地址添加断点(0xCC)时,我希望在debugEvent.u.Exception.ExceptionRecord.ExceptionCode

中得到EXCEPTION_BREAKPOINT

但是我得到的是 STATUS_WX86_BREAKPOINT(0x4000001F)。 MSDN网站将其定义为"An exception status code that is used by the Win32 x86 emulation subsystem."。没有对此行为的任何进一步解释。

我可以像EXCEPTION_BREAKPOINT一样处理这个异常吗?所以代码将是

switch(debugEvent.u.Exception.ExceptionRecord.ExceptionCode)
{
...
   case EXCEPTION_BREAKPOINT:
   case STATUS_WX86_BREAKPOINT:
      HandleBreakPoint();
   break;
...
}

当断点 (int 3) 异常来自在 WOW64 模式下执行的代码(64 位 Windows 中的 32 位代码)时,64 位调试器确实得到了 STATUS_WX86_BREAKPOINT。当来自 64 位代码的断点时 - STATUS_BREAKPOINT 。同样在单步异常上,64 位调试器得到 STATUS_SINGLE_STEP 如果这个异常来自 64 位代码,STATUS_WX86_SINGLE_STEP 如果来自 WOW64 代码的异常。

Can I handle this exception the same way as EXCEPTION_BREAKPOINT ?, so the code will be as

是的,你可以。 STATUS_WX86_SINGLE_STEP 也是如此——您可以像 STATUS_SINGLE_STEP 一样处理它。 WX86_ 为您提供了断点模式(WOW64 或本机)的更多信息。但在这两种情况下,这都是断点异常。逻辑如何处理它通常很常见。然而,这是您的选择,决定做什么以及如何处理断点、单步或其他异常。


还要注意 STATUS_WX86_BREAKPOINTSTATUS_WX86_SINGLE_STEP 只有 64 位调试器。 32 位调试器总是得到 STATUS_BREAKPOINT,而 64 位调试器得到 STATUS_WX86_BREAKPOINT,而 x64 调试器得到 STATUS_BREAKPOINT。单步也一样。例如,在 WOW64 进程启动时 - 64 位调试器有 2 个断点 - 首先 STATUS_BREAKPOINT 形成 64 位模式(在 64 位 ntdll.LdrpDoDebugBreak 内)然后 STATUS_WX86_BREAKPOINT 来自 32 位 ntdll.LdrpDoDebugBreak。而 32 位调试器仅使用 STATUS_BREAKPOINT.

获得第二个断点(来自 32 位代码)