Mos*_*afa 2 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;
...
}
Run Code Online (Sandbox Code Playgroud)
当断点 ( int 3) 异常来自于 WOW64 模式下执行的代码(64 位 Windows 中的 32 位代码)时,64 位调试器确实得到了STATUS_WX86_BREAKPOINT. 当 64 位代码断点时 - STATUS_BREAKPOINT. 同样,在单步异常 64 位调试器中,STATUS_SINGLE_STEP如果此异常来自 64 位代码,并且STATUS_WX86_SINGLE_STEP如果异常来自 WOW64 代码。
我可以像处理这个异常一样吗
EXCEPTION_BREAKPOINT?,所以代码将是
是的你可以。对于 也是如此STATUS_WX86_SINGLE_STEP- 您可以用与 相同的方式处理它STATUS_SINGLE_STEP。为WX86_您提供断点所在模式(WOW64 或本机)的附加信息。但在这两种情况下,这都是断点异常。以及如何处理它的逻辑通常很常见。然而,这是您的选择,决定做什么以及如何处理断点、单步或其他异常。
另请注意,STATUS_WX86_BREAKPOINT只有STATUS_WX86_SINGLE_STEP64 位调试器。32 位调试器总是能得到STATUS_BREAKPOINT64 位调试器得到的结果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。