奇怪的程序挂起,debug中这是啥意思?
Posted
技术标签:
【中文标题】奇怪的程序挂起,debug中这是啥意思?【英文标题】:Strange program hang, what does this mean in debug?奇怪的程序挂起,debug中这是什么意思? 【发布时间】:2010-09-18 14:25:51 【问题描述】:奇怪的程序挂起,debug中是什么意思?
附加windbg后发现如下:
(1714.258):访问冲突 - 代码 c0000005(第一次机会) 在任何异常处理之前报告第一次机会异常。 可以预期并处理此异常。 eax=015b5c74 ebx=178a13e0 ecx=dddddddd edx=009a8ca0 esi=09fbf698 edi=09fbf594 eip=005ae2f7 esp=09fbf4a4 ebp=09fbf594 iopl=0 nv up ei ng nz na pe nc cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00010286 TestApplication!std::_Container_base::_Orphan_all+0x57: 005ae2f7 c70100000000 mov dword ptr [ecx],0 ds:0023:dddddddd=????????调用栈:
TestApplication!std::_Container_base::_Orphan_all+0x57 TestApplication!std::vector >::operator=+0x37 TestApplication!boost::asio::detail::win_iocp_io_service::do_one+0x189 TestApplication!boost::asio::detail::win_iocp_io_service::run+0xa2 TestApplication!boost::asio::io_service::run+0x3a【问题讨论】:
【参考方案1】:如果您使用 MSVC 和调试构建配置,0xdddddddd
通常意味着您正在尝试访问已释放的内存。调试 CRT 内存管理器用0xdd
填充空闲内存。
【讨论】:
【参考方案2】:调用堆栈完全是 STL/Boost 代码。除非您正在做的事情不寻常,否则我不会假设该错误位于您粘贴的调用堆栈的任何部分。
需要检查的几件事:
任何应该定义但未定义的 Boost 特定 #define?
安全 SCL 和迭代器调试。尝试启用/禁用它。
您是否在混合调试和发布代码。 (使用 STL/Boost 容器是个坏主意)
【讨论】:
【参考方案3】:问题
第一次机会异常意味着调试器在将异常抛回程序处理问题之前,为您(使用调试器的人)提供了第一次调试异常的机会。
在这种情况下,异常是“访问冲突”。这意味着您的程序正在尝试从非法内存位置读取/写入。
访问冲突很严重,因为它可能会损坏一些对您的程序至关重要的内存,这可能是您的程序挂起的原因。
从错误指令看来,您似乎正试图从非法指令中获取 4 字节值的内容。
调试问题
如果这是您的代码,那么您可以通过将调试符号位置设置为编译器的输出文件夹来轻松调试此问题(这将包含相关的 pdb 文件)
当您收到此异常时,获取调用堆栈(其中一个视图窗口会拥有它)
这将向您显示代码中错误堆栈的起源位置。
现在打开包含此源的文件并在此处设置断点,程序将到达该点并在 Windebugger 内停止。从这一点开始调试,您将确切知道从哪一行代码中抛出了此违规行为
提示:Boost 带有源代码,因此您可以轻松地在此代码中设置断点。当您进入 asio::detail::win_iocp_io_service::do_one 时,请务必在调试时按 F11。
【讨论】:
【参考方案4】:ecx 寄存器的地址无效 (dddddddd)。我建议这是一个内存损坏的情况。考虑为进程打开 gflags。
【讨论】:
以上是关于奇怪的程序挂起,debug中这是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章
ActivityManager 中的奇怪函数:isUserAMonkey。这是啥意思,它有啥用?
AS3 中有啥奇怪的语法。为啥这会使我的浏览器挂起//静默崩溃