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

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

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

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


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

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

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

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

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

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

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

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

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


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

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

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

void TerminateRuntime(bool UnusualWay);

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

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

другими словами: какая ошибка msvcrt ловит и скрывается за неинформативным сообщением об ошибке?

1 ответов


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

из MSDN:

отмена

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

void abort( void );

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

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

Примечания

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

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

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

внутренне, когда abort() вызывается, он вызывает функцию _amsg_exit, определенными во внутренних.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.

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

стандарт C++ определяет условия, при которых terminate is звонил, и это довольно длинный список, так что я не буду их повторять. здесь. Обратитесь к вашей любимой копии стандарта C++ для деталей. (Этот наиболее частой причиной устраивает необработанное исключение.)