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

C++ 奇怪的程序挂起,这在调试中意味着什么?,c++,c,boost-asio,freeze,C++,C,Boost Asio,Freeze,奇怪的程序挂起,这在调试中意味着什么 在连接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=

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

在连接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
ecx寄存器的地址DDDD无效。我认为这是一个内存损坏的案例。考虑进程上的GLAG标记。

< P> ECX登记器有一个无效地址DDDDDDD。我认为这是一个内存损坏的案例。考虑在进程上打开GLAG。

如果您使用MSVC和调试生成配置,0xDDDDDDD通常意味着您正在尝试访问空闲内存。调试CRT内存管理器使用0xdd填充空闲内存。

如果您使用MSVC和调试生成配置,0xDDDD通常表示您正在尝试访问空闲内存。调试CRT内存管理器用0xdd填充空闲内存。

问题

第一次机会异常意味着调试器在将异常抛出程序以处理该问题之前,为您(使用调试器的人员)提供了第一次调试异常的机会

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

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

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

调试问题

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

当您获得此异常时,获取调用堆栈,其中一个视图窗口将拥有它

这将在代码中显示错误堆栈的起源位置

现在打开包含该源代码的文件并在那里设置断点,程序将到达该点并在windebugger内停止。从这一点进行调试,您就可以确切地知道此冲突是从哪一行代码引发的

提示:Boost附带源代码,因此您可以轻松地在代码中添加断点。当您到达asio::detail::win\u iocp\u io\u service::do\u one时,请确保在调试时按F11

问题

第一次机会异常意味着调试器在将异常抛出程序以处理该问题之前,为您(使用调试器的人员)提供了第一次调试异常的机会

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

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

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

调试问题

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

当您获得此异常时,获取调用堆栈,其中一个视图窗口将拥有它

这将在代码中显示错误堆栈的起源位置

现在打开包含该源代码的文件并在那里设置断点,程序将到达该点并在windebugger内停止。从这一点进行调试,您就可以确切地知道此冲突是从哪一行代码引发的


提示:Boost附带源代码,因此您可以轻松地在代码中添加断点。当您到达asio::detail::win\u iocp\u io\u service::do\u one时,请确保在调试时按F11

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

有几件事需要检查:

有没有应该定义但没有定义的特定于Boost的定义

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

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


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

有几件事需要检查:

有没有应该定义但没有定义的特定于Boost的定义

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

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