Странное зависание программы, что это значит в отладке?
-
03-07-2019 - |
Вопрос
Странное зависание программы, что это значит при отладке?
После прикрепления 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-байтового значения из недопустимой инструкции. Р>
Отладка проблемы
-
Если это ваш код, то вы можете легко устранить эту проблему, установив расположение символа отладки в выходной папке вашего компилятора (это будет содержать соответствующие файлы pdb)
-
Когда вы получите это исключение, получите стек вызовов (оно будет у одного из окон представления)
-
Это покажет вам местоположение в вашем коде, где произошел сбойный стек. Р>
-
Теперь откройте файл, содержащий этот источник, и установите там точку останова, и программа достигнет этой точки и остановится внутри windebugger. Отладка с этого момента, и вы бы точно знали, из какой строки кода выдается это нарушение
Ол>
Совет: Boost поставляется с исходным кодом, поэтому вы можете легко установить точку останова внутри этого кода. Обязательно нажимайте F11 во время отладки, когда попадете в asio :: detail :: win_iocp_io_service :: do_one. Р>
Другие советы
Если вы используете MSVC и конфигурацию сборки отладки, 0xdddddddd
обычно означает, что вы пытаетесь получить доступ к освобожденной памяти. Диспетчер памяти отладки CRT заполняет свободную память 0xdd
.
Регистр ecx имеет неверный адрес (dddddddd). Я бы предположил, что это случай повреждения памяти. Попробуйте включить gflags для этого процесса.
Колл-стэк - полностью код STL / Boost. Если что-то, что вы делаете, не является чем-то необычным, я не буду предполагать, что ошибка есть в любом разделе вставленного вами стека вызовов.
Несколько вещей для проверки:
<Ол>Какие-нибудь специфичные для Boost #defines должны быть определены, но не определены?
Secure SCL & amp; Отладка итератора. Попробуйте включить / отключить его.
Вы микшируете debug & amp; выпустить код. (плохая идея с контейнерами STL / Boost)