Подтвердить что ты не робот

В чем причина "Это приложение попросило Runtime прекратить его необычным способом"?

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

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

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


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

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

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

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

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

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

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

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

Итак, если бы я спросил вас, , что вызывает нарушение доступа, вы не сказали бы мне проверять трассировку стека или смотреть окно вывода или публиковать образец кода. Вы бы сказали, "Это от попыток доступа к памяти, которая недействительна".


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

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

Я (честно) уверен, что библиотека Microsoft Visual C Runtime не имеет функции:

void TerminateRuntime(bool UnusualWay);

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

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

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

4b9b3361

Ответ 1

Вы получите это сообщение, когда вызывается функция abort().

Из MSDN:

прерывания

Прерывает текущий процесс и возвращает код ошибки.

void abort( void );

Возвращаемое значение

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

Примечания

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

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

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

Внутри, когда вызывается abort(), он вызывает функцию _amsg_exit, определенный в файле internal.h, который в основном "испускает сообщение об ошибке времени выполнения для stderr для консольных приложений или отображает сообщение в окне сообщений для приложений Windows". Сообщение об ошибке для "Это приложение запросило Runtime для его прекращения необычным способом" определено в 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 support team for more information." EOL

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

rterr.h

#define _RT_ABORT  10  /* Abnormal program termination */

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


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

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

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

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

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