奇怪的程序挂起,这在调试中意味着什么?
连接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
答案 0 :(得分:6)
如果您正在使用MSVC和Debug构建配置,0xdddddddd
通常意味着您正在尝试访问释放的内存。调试CRT内存管理器使用0xdd
填充可用内存。
答案 1 :(得分:2)
问题
第一次机会异常意味着调试器正在向您(正在使用调试器的人)提供第一次调试异常的机会,然后再将其抛回程序以处理该问题。
在这种情况下,例外是“访问冲突”。这意味着您的程序正在尝试从非法内存位置读取/写入。
访问冲突是严重的,因为它可能会损坏一些对您的程序至关重要的内存,这可能是您的程序挂起的原因。
从错误指令看起来好像是在尝试从非法指令中获取4字节值的内容。
调试问题
如果这是您的代码,那么您可以通过将调试符号位置设置为编译器的输出文件夹(这将包含相关的pdb文件)来轻松调试此问题。
当你得到这个异常时,获取调用堆栈(其中一个视图窗口会有它)
这将显示代码中发生故障堆栈的位置。
现在打开包含此源的文件并在那里设置断点,程序将点击此点并停在windebugger内。从这一点开始调试,你就可以准确地知道抛出这个违规的代码行
提示:Boost附带了源代码,因此您可以轻松地在此代码中添加断点。当你到达asio :: detail :: win_iocp_io_service :: do_one时,一定要在调试时按F11。
答案 2 :(得分:1)
ecx寄存器的地址无效(dddddddd)。我建议这是一个内存损坏的案例。考虑为该过程打开gflags。
答案 3 :(得分:1)
callstack完全是STL / Boost代码。除非你正在做的事与众不同,否则我不会认为这个bug存在于你粘贴的callstack的任何部分。
要检查的几件事情:
应该定义的任何特定于Boost的#defines但不是吗?
安全SCL&迭代器调试。尝试启用/禁用它。
你在混合调试&发布代码。 (使用STL / Boost容器的坏主意)