我正在尝试在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;
...
}
答案 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位代码)。