1

Редко я получаю сообщение от какого-либо пользователя, что приложение прекратившая себя со следующим окном сообщения:Что такое «Visual C++ Visual Runtime Library: Runtime error!» и как я могу его захватить?

 
Microsoft C++ Visual Runtime Library 

Runtime error! 

Program: XXXXX.exe 

This application has requested the Runtime to terminate it in an unusual way. 
Please contact the application's support team for more information. 

К сожалению, приложение завершает silenly после показа сообщения. У нас есть генерация аварийного дампа в структурированных исключениях, но поскольку здесь нет исключения, не создается дамп аварий.

Что может быть причиной этого сообщения?

Есть ли способ изменить приложение, чтобы вместо (или в дополнение к) показывать сообщение генерируется minidump (или какая-либо другая пользовательская обработка выполняется приложением)?

+0

Вам понадобится мини-накопитель для его отладки. Попросите пользователя создать его, пока отображается диалоговое окно. Диспетчер задач в Vista/Win7 может это сделать. –

+0

Я бы предпочел, чтобы приложение автоматически генерировало мини-накопитель, точно так же, как при сбое. – Suma

ответ

4

Сообщение составлено abort(), которое может быть вызвано либо напрямую, либо плохо спроектированными исключениями - см. Неожиданный() или terminate(), как описано в Disable Microsoft Visual C++ Runtime Error. Отображается ли сообщение или нет, можно настроить с помощью вызова _set_abort_behavior. В XP и позже приложение должно создать мини-накопитель по умолчанию и отправить его в службу отчетов об ошибках Windows. Если вам нужен пользовательский обработчик (например, пользовательский аварийный дамп), единственная (нестандартная) возможность, похоже, заключается в предоставлении вашей собственной реализации функции abort().

Реализации по умолчанию прерывания в Microsoft C Runtime Library делает следующее:

  • показывает окно сообщения или выводит сообщение на консоль
  • поднимает обработчик SIGABRT, если есть какой-либо
  • если неисправность отчетности допускается, то
    • удаляет любой обработчик необработанных исключений с использованием SetUnhandledExceptionFilter (NULL)
    • выполняет UnhandledExceptionFilter с искусственно подготовленной информацией исключения
  • вызовов _exit (3), чтобы завершить процесс без какой-либо дополнительных очистки

Включая следующий код в вашем источнике делает приложение для выполнения по умолчанию структурированной обработки исключений (включая любой фильтр, который вы, возможно, установили):

extern "C" void __cdecl abort (void) 
{ 
    volatile int a = 0; 
    a = 1/a; 
} 
+0

Это подводит итог тому, что я узнал до сих пор - благодаря sharptooth для его ссылок и советов. – Suma

+1

Эффективно ли вы замените CRT-реализацию 'abort()' вашей? – sharptooth

+0

Да, точно. Остерегайтесь: это нестандартное (как определено стандартом, если вы используете системные заголовки, вы не можете предоставить свои собственные реализации функций, определенных в этих заголовках), поэтому не забудьте понять, что вы делаете. – Suma

3

Приложение вызвало abort(), скорее всего, потому что terminate() был вызван после того, как исключение ускользало от деструктора во время разворачивания стека или потому, что исключение не вызывалось.

См. an answer по номеру this related question. В основном вам нужно поймать и обработать все исключения на верхнем уровне, а не исключать исключения из деструкторов. Начните свою программу в отладчике и включите «Остановить, когда выбрано исключение», чтобы найти то, что именно происходит неправильно, и исправить это.

+0

Исключение C++ не включено в приложении. Я понимаю, что это может быть отменено() вызвано откуда-то еще. Есть ли другая причина?Есть ли способ переопределить обработку, сделать что-то еще, а не показывать сообщение? – Suma

+0

@Suma: вы можете использовать '_set_abort_behavior()' для подавления отображения окна сообщения. Вы также можете использовать 'set_terminate()' для замены обработчика 'terminate()'. И как исключения C++ не могут быть включены? – sharptooth

+0

Также «Начать вашу программу под отладчиком» в моем случае не очень полезно, поскольку это никогда не случалось со мной. Это происходит очень редко, я получаю этот отчет, может быть, несколько раз в год от какого-то пользователя. – Suma

 Смежные вопросы

  • Нет связанных вопросов^_^