Что такое «Microsoft C ++ Visual Runtime Library: Ошибка времени выполнения!»и как я могу захватить это? - PullRequest
1 голос
/ 18 ноября 2010

Редко я получаю сообщение от какого-то пользователя о том, что приложение завершило свою работу со следующим окном сообщения:

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.

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

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

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

Ответы [ 2 ]

4 голосов
/ 22 ноября 2010

Сообщение генерируется с помощью abort () , который может вызываться либо напрямую, либо из-за плохо спроектированных исключений - см. Непредвиденный () или terminate (), как описано в Отключить Microsoft Visual C ++ Ошибка выполнения . Отображается ли сообщение или нет, можно настроить с помощью вызова _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;
}
3 голосов
/ 18 ноября 2010

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

См. ответ на этот связанный вопрос для получения подробной информации. По сути, вы должны отлавливать и обрабатывать все исключения на верхнем уровне, чтобы исключение не ускользало от деструкторов. Запустите вашу программу под отладчиком и включите «Остановить, когда возникнет исключение», чтобы найти, что именно идет не так внутри, и исправить это.

...