Если ваше приложение испаряется, а не создает файл дампа, то, скорее всего, генерируется исключение, которое ваше приложение не может (или не может) обработать.Это может произойти в двух случаях:
1) Генерируется исключение верхнего уровня, и для этого типа исключения нет соответствующего блока catch
.
2) У вас есть соответствующий catch
block (например, catch(...)
), но вы генерируете исключение в этом обработчике.Когда это произойдет, Windows вырвет кости из вашей программы.Ваше приложение просто перестанет существовать.Дамп не будет сгенерирован, и практически ничего не будет записано. Это последняя попытка Windows не дать программе-мошеннику уничтожить всю систему.
Примечание о catch(...)
.Это явно зло.В рабочем коде (почти) никогда не должно быть catch(...)
.Люди, которые пишут catch(...)
, обычно утверждают одну из двух вещей:
«Моя программа никогда не должна аварийно завершать работу. Если что-то случится, я хочу восстановиться после исключения и продолжить работу. Это серверное приложение!
-или-
"Моя программа может аварийно завершить работу, но если это произойдет, я хочу создать файл дампа по пути вниз."
Первый - наивный иопасное отношение, потому что если вы попытаетесь справиться с каждым исключением и оправиться от него, вы сделаете что-то плохое для своего рабочего места.Может быть, вы разберетесь в куче, оставите ресурсы открытыми, которые должны быть закрыты, создадите тупики или условия гонки, кто знает.Ваша программа в конечном итоге пострадает от фатального сбоя.Но к тому времени стек вызовов уже не будет похож на то, что вызвало настоящую проблему, и никакой файл дампа вам никогда не поможет.
Последний - благородный и надежный подход, но реализация его гораздо болееТрудно, что это может показаться, и это чревато опасностью.Проблема в том, что вы должны избегать генерации каких-либо дополнительных исключений в вашем обработчике исключений, и ваша машина уже находится в очень шатком состоянии.Операции, которые обычно совершенно безопасны, внезапно становятся ручными гранатами.new
, delete
, любые функции CRT, форматирование строк и даже выделение на основе стека, такие как char buf[256]
, могут заставить ваше приложение перейти> POOF <и исчезнуть.Вы должны предположить, что стек и куча лежат в руинах.Нет распределения безопасно.</p>
Кроме того, могут возникать исключения, которые блок catch
просто не может перехватить, например, исключения SEH.По этой причине я всегда пишу обработчик необработанных исключений и регистрирую его в Windows через SetUnhandledExceptionFilter .В моем обработчике исключений я выделяю каждый байт, который мне нужен, через статическое распределение, даже до запуска программы.Лучшая (наиболее надежная) вещь, которую нужно сделать в этом обработчике, - запустить отдельное приложение, которое сгенерирует файл MiniDump извне вашего приложения.Тем не менее, вы можете создать MiniDump из самого обработчика, если вы очень осторожны и не вызываете какую-либо функцию CRT прямо или косвенно.По сути, если это не функция API, которую вы вызываете, она, вероятно, небезопасна.