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

标签 c windows debugging breakpoints

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

当我在指定地址添加断点( 0xCC )时,我期望得到 EXCEPTION_BREAKPOINTdebugEvent.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_BREAKPOINTSTATUS_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/

相关文章:

android - “在 Chrome 中调试”不适用于 android 的 native react

windows - 如何调试无响应的Grails应用程序?

c - 如何在 C 中找到我的 Tap 适配器的桥接设备名称?

c# - SSL 证书预取 .NET

windows - 通过 Ruby 持久化环境变量

windows - 是否可以将 Windows Azure Mobile 服务与需要关系数据库的 Windows 8 应用程序一起使用?

c - linux <termios.h> echo 及其含义

c - 在此 C 程序中,静态变量在内存中的位置如何变化?

c - 为什么按空格键不会在数组中放置一个值?

windows - 调试 "service failed to start"Windows Installer 错误