Что является причиной "Это приложение запросило среду выполнения прекратить его необычным способом"? - PullRequest
57 голосов
/ 18 ноября 2011

Существует распространенная ошибка, возникающая во время выполнения Visual C:

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

Что на самом деле означает это сообщение об ошибке означает ?


Позвольте мне использовать притчу, чтобы точно объяснить, о чем я спрашиваю.

Если я вижу сообщение:

Исключение: нарушение доступа (0xc0000005), адрес 0x702be865

Это нарушение доступа не имеет никакого отношения кделать с сексуальными домогательствами, или кто-то пытался проникнуть в мой компьютер (кроме General Failure был бригадный генерал, который пытался прочитать мой диск C, или что вы могли быть доставлены в тюрьму за выполнение незаконной операции в Windows 95).

В этом случае нарушение доступа соответствует константе EXCEPTION_ACCESS_VIOLATION (объявленной в winbase.h со значением 0xC0000005).Это постоянное одно возможное исключение кода ошибки, который может быть возвращен в структуре EXCEPTION_RECORD.Код ACCESS_VIOLATION означает, что программа пыталась прочитать или записать адрес в памяти, чего не должно быть.Если вы пытаетесь прочитать с адреса памяти, который никогда не выделялся, вы делаете что-то ужасно плохое - и об этом вам говорит исключение.

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

Примечание : Я не спрашиваю:

  • почему программа x получает ошибку C0000005?
  • почему мой код получает нарушение прав доступа?
  • как мне отладить нарушение доступа?

Так что, если бы я спросил вас, что вызывает нарушение доступа , вы бы мне не сказалипроверить трассировку стека, или посмотреть окно вывода, или опубликовать пример кода.Вы скажете, «Это из-за попытки доступа к памяти, которая недопустима».


Вернуться к моему вопросу.Что означает следующая ошибка:

Это приложение запросило завершение работы среды необычным способом.

Я (довольно) уверен, что среда выполнения Microsoft Visual CБиблиотека не имеет функции:

void TerminateRuntime(bool UnusualWay);

Поэтому я должен попытаться выяснить, что это на самом деле означает:

  • Что означает завершение библиотека времени выполнения Visual C?(msvcrt - это dll; вы не прекращаете его, вы просто больше его не используете)
  • Каким будет обычный способ завершить MSVCRT?
  • Кто-нибудь выберет , чтобы прекратить его необычным способом?
  • Является ли сегодняшний необычным способом на самом деле давно устарелымформа того, что раньше было обычным способом?
  • Если бы я был (по ошибке), прервав его необычным образом, что бы я сделал, чтобы прекратить его в обычный способ?

Другими словами: какая ошибка перехватывает MSVCRT и скрывается за неинформативным сообщением об ошибке?

1 Ответ

41 голосов
/ 18 ноября 2011

Это сообщение появляется при вызове функции abort().

От MSDN:

1011 * прервать * Прерывает текущий процесс и возвращает код ошибки. void abort( void ); Возвращаемое значение

abort не возвращает управление вызывающему процессу. По умолчанию он завершает текущий процесс и возвращает код выхода 3.

Примечания

По умолчанию процедура abort выводит сообщение:

"Это приложение запросило среду выполнения прервать его необычным способом. Для получения дополнительной информации обратитесь в службу поддержки приложения."

Похоже, что в последней версии среды выполнения VC сообщение было заменено на "abort () вызвано", возможно, чтобы прояснить, что оно на самом деле означает. Если вы хотите воспроизвести это сообщение, используйте старую среду выполнения VC (VC ++ 6.0 наверняка) и вызовите abort().

Внутренне, когда вызывается abort(), она вызывает функцию _amsg_exit , определенную в internal.h, которая в основном «выдает сообщение об ошибке времени выполнения в stderr для консольных приложений, или отображает сообщение в окне сообщения для приложений Windows ". Сообщение об ошибке «Это приложение запросило среду выполнения прекратить его необычным способом» определено в файле cmsgs.h:

cmsgs.h

#define _RT_ABORT_TXT  "" EOL "This application has requested the Runtime to terminate it in an unusual way.\nPlease contact the application's support team for more information." EOL

и код ошибки, который передается в (_RT_ABORT), определен в rterr.h:

rterr.h

#define _RT_ABORT  10  /* Abnormal program termination */

Таким образом, вы можете воспроизвести это, позвонив по номеру _amsg_exit( _RT_ABORT )


Обновление постером вопроса : Через две недели после того, как я задал этот вопрос, Раймонд Чен ответил на него в своем блоге :

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

Это сообщение печатается функцией выполнения C abort , то же самое функция, которая также заставляет вашу программу завершаться с кодом выхода 3 .

Ваша программа может явно вызывать прерывание или может оказаться вызывается неявно самой библиотекой времени выполнения.

Стандарт C ++ разъясняет условия, при которых terminate называется, и это довольно длинный список, поэтому я не буду повторять их Вот. Обратитесь к вашей любимой копии стандарта C ++ для деталей. (The Наиболее распространенная причина - создание необработанного исключения.)

...