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

StackOverflow https://stackoverflow.com/questions/226577

  •  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-байтового значения из недопустимой инструкции.

  • Отладка проблемы

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

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

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

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

    5. Совет: 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)

  • Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top