【问题标题】:Why do I get STATUS_WX86_BREAKPOINT instead of EXCEPTION_BREAKPOINT when debugging 32 bit application on 64 machine?为什么在 64 位机器上调试 32 位应用程序时得到 STATUS_WX86_BREAKPOINT 而不是 EXCEPTION_BREAKPOINT?
【发布时间】:2018-08-19 18:22:03
【问题描述】:

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

当我在指定地址添加断点(0xCC)时,我期望在debugEvent.u.Exception.ExceptionRecord.ExceptionCode中得到EXCEPTION_BREAKPOINT

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

我可以像EXCEPTION_BREAKPOINT 一样处理这个异常吗?所以代码将是

switch(debugEvent.u.Exception.ExceptionRecord.ExceptionCode)
{
...
   case EXCEPTION_BREAKPOINT:
   case STATUS_WX86_BREAKPOINT:
      HandleBreakPoint();
   break;
...
}

【问题讨论】:

  • 还添加了关于调试器(32/64 位)的区别。 STATUS_WX86_BREAKPOINT 只有 64 位调试器,基于此可以说你运行 64 位代码
  • 对于那些来自谷歌搜索 STATUS_WX86_BREAKPOINT = 0x4000001f 的人:相关的 MSDN 文档是 MS-ERREF: 2.3.1 NTSTATUS ValuesUsing NTSTATUS Values。他们说:“NTSTATUS 类型在 Ntdef.h 中定义,系统提供的状态代码在 Ntstatus.h 中定义。” 对我来说,#include "Ntstatus.h" 使 STATUS_WX86_BREAKPOINT 可用。

标签: c windows debugging breakpoints


【解决方案1】:

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

我可以像EXCEPTION_BREAKPOINT一样处理这个异常吗?,所以 代码将是

是的,你可以。 STATUS_WX86_SINGLE_STEP 也是如此 - 您可以像 STATUS_SINGLE_STEP 一样处理它。 WX86_ 为您提供断点模式(WOW64 或本机)的附加信息。但在这两种情况下,这都是断点异常。和逻辑如何处理它通常很常见。然而,这是你的选择,决定做什么以及如何处理断点、单步或其他异常。


另请注意,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 内),然后是 STATUS_WX86_BREAKPOINT 来自 32 位 ntdll.LdrpDoDebugBreak。而 32 位调试器只有第二个断点(来自 32 位代码)STATUS_BREAKPOINT

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-17
    • 1970-01-01
    • 2013-01-03
    • 1970-01-01
    • 2011-03-07
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多