Странное зависание программы, что это значит в отладке? - PullRequest
1 голос
/ 22 октября 2008

Странное зависание программы, что это значит в отладке?

После прикрепления 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 ]

6 голосов
/ 22 октября 2008

Если вы используете MSVC и конфигурацию сборки Debug, 0xdddddddd обычно означает, что вы пытаетесь получить доступ к освобожденной памяти. Диспетчер отладочной памяти CRT заполняет свободную память 0xdd.

2 голосов
/ 22 октября 2008

Проблема

  1. Исключения первого шанса означают, что отладчик дает вам, человеку, использующему отладчик, первый шанс отладить исключение, прежде чем он выбрасывает его обратно в программу для обработки проблемы.

  2. В этом случае исключением является «Нарушение прав доступа». Это означает, что ваша программа пытается читать / писать из недопустимого места в памяти.

  3. Нарушения прав доступа являются серьезными, поскольку это может привести к повреждению некоторой памяти, что критично для вашей программы, и это может быть вероятной причиной зависания вашей программы.

  4. Из ошибочной инструкции кажется, что вы пытаетесь получить содержимое 4-байтового значения из недопустимой инструкции.

Устранение неполадок

  1. Если это ваш код, вы можете легко отладить эту проблему, установив расположение символа отладки в выходной папке вашего компилятора (это будет содержать соответствующие файлы pdb)

  2. Когда вы получите это исключение, получите стек вызовов (оно будет у одного из окон просмотра)

  3. Это покажет вам местоположение в вашем коде, где произошел сбойный стек.

  4. Теперь откройте файл, содержащий этот источник, и установите там точку останова, и программа достигнет этой точки и остановится внутри windebugger. Отладка с этого момента, и вы бы точно знали, из какой строки кода выдается это нарушение

Совет: Boost поставляется с исходным кодом, поэтому вы можете легко установить точку останова в этом коде. Обязательно нажимайте F11 во время отладки, когда попадете в asio :: detail :: win_iocp_io_service :: do_one.

1 голос
/ 22 октября 2008

Callstack полностью STL / Boost-код. Если что-то, что вы делаете, не является чем-то необычным, я не буду предполагать, что ошибка есть в любом разделе вставленного вами стека вызовов.

Несколько вещей для проверки:

  1. Какие-нибудь специфичные для Boost #defines должны быть определены, но не определены?

  2. Безопасная отладка SCL и итератора. Попробуйте включить / отключить его.

  3. Вы смешиваете код отладки и выпуска. (плохая идея с контейнерами STL / Boost)

1 голос
/ 22 октября 2008

Регистр ecx имеет неверный адрес (dddddddd). Я бы предположил, что это случай повреждения памяти. Попробуйте включить gflags для процесса.

...