代码之家  ›  专栏  ›  技术社区  ›  Brian R. Bondy

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

  •  1
  • Brian R. Bondy  · 技术社区  · 16 年前

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

    在连接了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 回复  |  直到 16 年前
        1
  •  2
  •   computinglife    16 年前

    问题

    1. 第一次出现异常意味着调试器在将异常抛出到程序以处理该问题之前,给了使用调试器的人第一次调试异常的机会。

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

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

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

    调试问题

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

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

    3. 这将显示代码中产生错误堆栈的位置。

    4. 现在打开包含这个源代码的文件并在那里设置一个断点,程序将到达这个点并在windebugger中停止。从这一点进行调试,您就可以确切地知道从哪一行代码中抛出了此违规行为。

    提示:boost和source一起提供,这样您就可以轻松地在代码中放置一个断点。当您到达asio::detail::win_iocp_io_service::do_one时,请确保在调试时按F11。

        2
  •  6
  •   Tim Cooper    13 年前

    如果您使用的是MSVC和调试生成配置, 0xdddddddd 通常意味着您正试图访问释放的内存。调试CRT内存管理器用 0xdd .

        3
  •  1
  •   Jorge Ferreira    16 年前

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

        4
  •  1
  •   user61051    16 年前

    调用堆栈完全是stl/boost代码。除非你所做的事情不寻常,否则我不会假设bug在你粘贴的调用堆栈的任何部分。

    需要检查的几个事项:

    1. 任何特定于提升的定义都应该定义,但不是吗?

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

    3. 是否混合了调试和发布代码。(STL/Boost容器的坏主意)