奇怪的程序挂起,这在调试中意味着什么?

时间:2008-10-22 16:29:46

标签: c++ c boost-asio hang

奇怪的程序挂起,这在调试中意味着什么?

连接windbg后,我发现了以下内容:

(1714.258): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
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 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:2)

问题

  1. 第一次机会异常意味着调试器正在向您(正在使用调试器的人)提供第一次调试异常的机会,然后再将其抛回程序以处理该问题。

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

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

  4. 从错误指令看起来好像是在尝试从非法指令中获取4字节值的内容。

  5. 调试问题

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

    2. 当你得到这个异常时,获取调用堆栈(其中一个视图窗口会有它)

    3. 这将显示代码中发生故障堆栈的位置。

    4. 现在打开包含此源的文件并在那里设置断点,程序将点击此点并停在windebugger内。从这一点开始调试,你就可以准确地知道抛出这个违规的代码行

    5. 提示:Boost附带了源代码,因此您可以轻松地在此代码中添加断点。当你到达asio :: detail :: win_iocp_io_service :: do_one时,一定要在调试时按F11。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

callstack完全是STL / Boost代码。除非你正在做的事与众不同,否则我不会认为这个bug存在于你粘贴的callstack的任何部分。

要检查的几件事情:

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

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

  3. 你在混合调试&发布代码。 (使用STL / Boost容器的坏主意)