为什么我在 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_BREAKPOINT
和 STATUS_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 位代码)
我正在尝试在 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_BREAKPOINT
和 STATUS_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
.