在64台计算机上调试32位应用程序时,为什么会得到STATUS_WX86_BREAKPOINT而不是EXCEPTION_BREAKPOINT?

时间:2018-08-19 18:22:04

标签: c windows debugging breakpoints

我正在尝试在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;
...
}

1 个答案:

答案 0 :(得分:4)

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

  

我可以像处理STATUS_WX86_SINGLE_STEP一样处理此异常吗?   该代码将为

是的,可以。 EXCEPTION_BREAKPOINT也是如此-您可以使用与STATUS_WX86_SINGLE_STEP相同的方式来处理它。 STATUS_SINGLE_STEP为您提供了其他信息(从哪个模式(WOW64或纯模式)作为断点)。但这两种情况都是断点异常。和逻辑通常如何处理。但是,这是您的决定,它决定做什么以及如何处理断点,单步或其他异常。


还要注意,WX86_STATUS_WX86_BREAKPOINT仅获得了64位调试器。 32位调试器总是获得STATUS_WX86_SINGLE_STEP,而64位调试器总是获得STATUS_BREAKPOINT,而x64调试器得到STATUS_WX86_BREAKPOINT则什么也没有。单个步骤相同。例如,在WOW64进程启动时-64位调试器有2个断点-首先STATUS_BREAKPOINT形成64位模式(在64位STATUS_BREAKPOINT内部),然后ntdll.LdrpDoDebugBreak从32位{{ 1}}。而32位调试器仅使用STATUS_WX86_BREAKPOINT获得了第二个断点(来自32位代码)。