我正在尝试在Windows上编写一个简单的调试器来调试32位应用程序,我的机器是64位的。我用的是C语言。
当我在指定地址添加断点( 0xCC
)时,我期望得到 EXCEPTION_BREAKPOINT
值 debugEvent.u.Exception.ExceptionRecord.ExceptionCode
但是我得到STATUS_WX86_BREAKPOINT(0x4000001F)
反而。
MSDN 网站将其定义为“Win32 x86 仿真子系统使用的异常状态代码”。。对此行为没有任何进一步的解释。
我可以像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 位代码,则 64 位调试器会得到 STATUS_SINGLE_STEP
;如果此异常来自 WOW64 代码,则 64 位调试器会得到 STATUS_WX86_SINGLE_STEP
。
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 或 native )的附加信息。但在这两种情况下,这都是断点异常。以及如何处理它的逻辑通常很常见。然而,这是您的选择,决定做什么以及如何处理断点、单步或其他异常。
另请注意,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
内部),然后 来自 32 位 ntdll.LdrpDoDebugBreak 的 STATUS_WX86_BREAKPOINT
。而 32 位调试器仅通过 STATUS_BREAKPOINT
获得第二个断点(来自 32 位代码)。
关于c - 为什么在 64 计算机上调试 32 位应用程序时得到 STATUS_WX86_BREAKPOINT 而不是 EXCEPTION_BREAKPOINT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51920593/