2008-10-22 23 views
1

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

附着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 

回答

2

问题

  1. 第一次机会异常意味着调试器是给你的,谁在使用调试器,第一次有机会调试异常的人,它抛出它回到了程序之前来处理这个问题。

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

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

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

调试问题

  • 如果这是你的代码,那么你可以很容易地通过调试符号位置设置的输出文件夹调试这个问题你编译器(这将包含有关pdb文件)

  • 当你得到这个异常得到调用堆栈(视图窗口的人会拥有它)

  • 这将显示代码中发生错误堆栈的位置。

  • 现在打开包含这个源文件,并在那里设置一个断点,程序会打到这一点并停止在windebugger中。从这个角度调试,你会知道到底从哪个代码行这违反抛出

  • 提示:升压带有源,以便可以轻松的放进一个破发点在代码里。当你进入asio :: detail :: win_iocp_io_service :: do_one时,一定要在调试时按F11。

    1

    ECX寄存器具有无效地址(DDDDDDDD)。我会建议这是一个内存损坏的情况。考虑将流程转换为gflags。

    6

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

    1

    该callstack完全是STL/Boost代码。除非你正在做的事情与众不同,否则我不会认为这个错误出现在你所粘贴的堆栈的任何部分。

    几件事情要检查:应定义,但是的arent

    1. 任何升压具体#定义?

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

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