1

奇怪的程序挂起,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
4

4 回答 4

7

如果您使用 MSVC 和 Debug 构建配置,0xdddddddd通常意味着您正在尝试访问已释放的内存。调试 CRT 内存管理器用0xdd.

于 2008-10-22T16:49:09.627 回答
3

问题

  1. 第一次机会异常意味着调试器正在给你,使用调试器的人,第一次调试异常的机会,然后它将异常抛出回程序来处理问题。

  2. 在这种情况下,例外是“访问冲突”。这意味着您的程序正在尝试从非法内存位置读取/写入。

  3. 访问冲突很严重,因为它可能会破坏一些对您的程序至关重要的内存,这可能是您的程序挂起的原因。

  4. 从错误指令看来,您似乎正试图从非法指令中获取 4 字节值的内容。

调试问题

  1. 如果这是您的代码,那么您可以通过将调试符号位置设置为编译器的输出文件夹来轻松调试此问题(这将包含相关的 pdb 文件)

  2. 当您收到此异常时,请获取调用堆栈(其中一个视图窗口会拥有它)

  3. 这将向您显示代码中错误堆栈的起源位置。

  4. 现在打开包含此源的文件并在此处设置断点,程序将到达该点并在 Windebugger 内停止。从这一点开始调试,您将确切知道从哪一行代码中引发了此违规行为

提示:Boost 带有源代码,因此您可以轻松地在此代码中放置断点。当您进入 asio::detail::win_iocp_io_service::do_one 时,请务必在调试时按 F11。

于 2008-10-22T16:53:42.177 回答
2

ecx 寄存器的地址无效 (dddddddd)。我建议这是一个内存损坏的情况。考虑为该进程打开 gflags。

于 2008-10-22T16:32:48.457 回答
2

调用堆栈完全是 STL/Boost 代码。除非您所做的事情与众不同,否则我不会假设该错误位于您粘贴的调用堆栈的任何部分。

有几件事要检查:

  1. 任何应该定义但不是 Boost 的特定 #defines?

  2. 安全 SCL 和迭代器调试。尝试启用/禁用它。

  3. 您是否正在混合调试和发布代码。(使用 STL/Boost 容器是个坏主意)

于 2008-10-22T19:36:52.890 回答