为啥在启动程序时单步执行每条指令都会崩溃? [调试]

Posted

技术标签:

【中文标题】为啥在启动程序时单步执行每条指令都会崩溃? [调试]【英文标题】:Why does stepping every instruction crashes while launching the program works? [debugging]为什么在启动程序时单步执行每条指令都会崩溃? [调试] 【发布时间】:2012-05-02 17:32:45 【问题描述】:

我正在尝试在调试器 (ollydbg) 中按照我用 C++ 编译的一个简单程序的执行说明(它计算一些素数然后退出),但我有几个问题:

为什么第一条指令不是“CODE”部分的入口点?不一样 只要我“跳过”一些指令,调试器就会崩溃并写入“ntdll.someaddress 处的单步事件,按 shift+F7/F8/F9 将异常传递给程序”并崩溃。如果我在不执行指令的情况下运行程序,它可以正常工作并且程序加载没有问题

为什么会这样?这不仅发生在我的程序中,还发生在其他几个程序中(我系统中几乎每隔一个 32 位 exe)

【问题讨论】:

这是 32 位程序吗?在 64 位操作系统上? 【参考方案1】:

如果你在 64 位操作系统下运行 OllyDbg,那我相信你不走运,因为 OllyDbg 不支持 x86-64 Windows,甚至不支持用于调试 32 位应用程序的调试器。请参阅this forum thread,它是从 2006 年开始的,但我认为从那以后没有任何变化。他们建议使用不同的调试器,例如 64 位版本的 WinDbg(这是一个很棒的调试器)。

为什么第一条指令不是“CODE”部分的入口点?不一样

您可以在 OllyDbg 中进行设置:选项 - 调试选项 - 事件 - “首先暂停”。您可以从“系统断点”开始,它位于 ntdll 中,甚至在调用启动模块的入口点之前就被调用。

【讨论】:

谢谢,希望例外只是因为x64不兼容

以上是关于为啥在启动程序时单步执行每条指令都会崩溃? [调试]的主要内容,如果未能解决你的问题,请参考以下文章

80X86保护模式及其编程

转义陷阱标志/单步

[Win32]一个调试器的实现调试符号

避免在 Chrome 开发者工具中单步执行 javascript 文件?

GDB调试指南-单步调试

为啥注入的任何 DLL 都会使主机进程崩溃?