C 在64位计算机上调试32位应用程序时,为什么要获取状态\u WX86\u断点而不是异常\u断点?

C 在64位计算机上调试32位应用程序时,为什么要获取状态\u WX86\u断点而不是异常\u断点?,c,windows,debugging,breakpoints,C,Windows,Debugging,Breakpoints,我正在尝试在Windows上编写一个简单的调试器来调试32位应用程序,我的机器是64位的。我用的是C语言 当我在指定的地址添加断点(0xCC)时,我希望在debugEvent.u.EXCEPTION.ExceptionRecord.ExceptionCode> 但是,我得到的是状态\u WX86\u断点(0x4000001F)。 MSDN网站将其定义为“Win32 x86仿真子系统使用的异常状态代码”。对这种行为没有任何进一步的解释 我可以用与异常\u断点相同的方法处理此异常吗?因此,代码如下所

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

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

但是,我得到的是
状态\u WX86\u断点(0x4000001F)
。 MSDN网站将其定义为“Win32 x86仿真子系统使用的异常状态代码”。对这种行为没有任何进一步的解释

我可以用与
异常\u断点
相同的方法处理此异常吗?因此,代码如下所示

switch(debugEvent.u.Exception.ExceptionRecord.ExceptionCode)
{
...
   case EXCEPTION_BREAKPOINT:
   case STATUS_WX86_BREAKPOINT:
      HandleBreakPoint();
   break;
...
}
当在WOW64模式下执行的代码(64位Windows中的32位代码)出现断点(
int 3
)异常时,64位调试器确实获得了
状态\u WX86\u断点
。当断点从64位代码-
状态\u断点
。此外,在单步异常中,64位调试器从64位代码中获取了
状态单步
如果此异常,并且从WOW64代码中获取了
状态单步

我可以像处理断点一样处理这个异常吗 代码如下所示

是的,你可以。
STATUS\u WX86\u SINGLE\u STEP
也是如此-您可以用与
STATUS\u SINGLE\u STEP
相同的方式处理它。
WX86
提供了从哪个模式(WOW64或本机)作为断点的附加信息。但在这两种情况下,这都是断点异常。逻辑和处理它的方式通常很常见。然而,这是您的选择,您可以决定做什么以及如何处理断点、单步或其他异常


还请注意,
STATUS\u WX86\u断点
STATUS\u WX86\u单步
仅获取64位调试器。32位调试器始终获取
状态\u断点
,其中64位调试器获取
状态\u WX86\u断点
,而x64调试器获取
状态\u断点
时未获取任何内容。单步也一样。例如,在WOW64进程启动时,64位调试器获得了2个断点-首先是从64位模式(在64位
ntdll.LdrpDoDebugBreak
内)获得的
状态\u断点,然后是从32位
ntdll.LdrpDoDebugBreak
获得的
状态\u断点。当断点(
int 3
)是在WOW64模式下执行的代码(64位Windows中的32位代码)中出现异常时,32位调试器只获得了第二个断点(来自32位代码),其状态为
断点
,。当断点从64位代码-
状态\u断点
。此外,在单步异常中,64位调试器从64位代码中获取了
状态单步
如果此异常,并且从WOW64代码中获取了
状态单步

我可以像处理断点一样处理这个异常吗 代码如下所示

是的,你可以。
STATUS\u WX86\u SINGLE\u STEP
也是如此-您可以用与
STATUS\u SINGLE\u STEP
相同的方式处理它。
WX86
提供了从哪个模式(WOW64或本机)作为断点的附加信息。但在这两种情况下,这都是断点异常。逻辑和处理它的方式通常很常见。然而,这是您的选择,您可以决定做什么以及如何处理断点、单步或其他异常


还请注意,
STATUS\u WX86\u断点
STATUS\u WX86\u单步
仅获取64位调试器。32位调试器始终获取
状态\u断点
,其中64位调试器获取
状态\u WX86\u断点
,而x64调试器获取
状态\u断点
时未获取任何内容。单步也一样。例如,在WOW64进程启动时,64位调试器获得了2个断点-首先是从64位模式(在64位
ntdll.LdrpDoDebugBreak
内)获得的
状态\u断点,然后是从32位
ntdll.LdrpDoDebugBreak
获得的
状态\u断点。虽然32位调试器只获得了第二个断点(来自32位代码),但断点的状态为
STATUS\u

,还添加了关于调试器(32/64位)的差异
STATUS\u WX86\u BREAKPOINT
只获得了64位调试器,基于此可以说您运行64位code还添加了关于调试器(32/64位)的差异<代码>状态\u WX86\u断点
只有64位调试器,基于此可以说您运行了64位代码