MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Runtime Library error. Не запускается приложение"
Answer 782384
Механизм появления такой ошибки
Сообщение "This application has requested the Runtime to terminate it in an unusual way" выводится, когда:
- в приложении С++ возникло необработанное исключение
- версия стандартной библиотеки Visual C++ - 2010 или ниже
- приложение собрано с использованием отладочной версии стандартной библиотеки
Если версия стандартной библиотеки Visual C++ - 2012 или более новая, вместо этого будет выведено другое сообщение, чуть более осмысленное ("abort() has been called" - см. ниже) и позволяющее по нажатию кнопки Retry активировать just-in-time отладчик, если он установлен в системе.
Если приложение собрано с использованием релизной версии стандартной библиотеки, вместо этого выведется сообщение с предложением отправить отчет в Microsoft, а также в системный журнал будет занесено событие Application Error. Если установлен just-in-time отладчик, он, скорее всего, активируется автоматически и предложит выполнить отладку.
Может показаться странным, почему выводится такое малоинформативное сообщение. Это связано с принятым в С++ механизмом обработки исключений. Если исключение не обработано ни одним обработчиком в пользовательском коде, будет вызван специальный аварийный обработчик. Он имеет такой прототип:
void terminate(void);
Как видно, в него не передается вообще никаких параметров об ошибке, поэтому вывести информативное сообщение невозможно. Реализация этого обработчика по умолчанию просто вызывает функцию abort. Эта функция и выводит сообщение об ошибке (в отладочном режиме), вызывает сигнал SIGABRT (который позволяет отладчику включится в работу), а затем завершает работу приложения. Этот обработчик можно переопределить вызовом
set_terminate
, но обычно толку от этого нет.Подробнее: Unhandled C++ Exceptions
Примечание. Эта ошибка почти никогда не связана с отсутствием каких-то библиотек. При отсутствии библиотек, слинкованных через LIB-файл, обычно выводится что-то вроде "Не удалось запустить приложение, потому что оно некорректно настроено".
Как отладить такую ошибку
Обычно ответ прост - обрабатывать все исключения и выводить на экран и/или в лог подробную информацию об ошибке (можно также логировать и весь ход работы программы, чтобы было проще определить, на каком этапе возникла проблема). В случае данного вопроса, этого было достаточно.
Однако, иногда могут возникнуть более сложные ситуации. Что, если программа падает с загадочной ошибкой глубоко внутри функции сторонней библиотеки, от которой нет исходников? Тогда понадобится использовать отладчик - стандартный из студии или WinDBG. Для получения максимального эффекта от отладчика нужно:
- Подложить файлы символов (*.pdb) ко всем модулям, для которых они есть
- Настроить отладчик на использование серверов символов Microsoft (там лежат символы от стандартной библиотеки и библиотек ОС)
- Включить автоматическую остановку на исключениях
Это позволит извлечь какую-то информацию из кода ошибки, места ее возникновения и стека вызовов в этот момент.
Ссылки:
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.