У меня возникают некоторые трудности с определением причины выхода из процесса. У меня есть точка останова в каком-то коде завершения работы, который я отлаживаю, но после того, как в этом случае произошел сбой в отладчике и остановился один раз, весь процесс завершается немедленно. Каждый поток сообщает код выхода -1 в окне вывода. В то время в процессе было большое количество потоков, а база кода довольно велика, что затрудняет поиск виновного.
Я пытался установить std::atexit
функция, но это не получает удар. Я также пытался переопределить SetUnhandledExceptionFilter
, в случае, если это вызвано сбоем, и это также не получает удар. В проекте отключены исключения (#define _HAS_EXCEPTIONS=0
), поэтому я не могу позвонить std::set_terminate
или же std::set_unexpected
,
Есть ли какой-то другой способ определить, что является причиной выхода из процесса? Какой-то вариант, чтобы сломаться в отладчике, когда процесс собирается завершиться?
Запустите ваше приложение с отладчиком и прочитайте выходные данные отладки. Если приложение закрывается из-за исключений C ++ или SEH, вы прочтете его в окне вывода.
Если вы не увидите там ничего интересного, это означает, что ваше приложение называется ExitProcess / ExitThread / exit или, что еще хуже, TerminateProcess / TerminateThread / _exit.
Вы можете поставить точки останова на них. Установите точку останова при запуске, запустите отладчик. Убедитесь, что у вас есть отладочные символы, загруженные для соответствующих DLL, kernel32.dll для ExitProcess и друзей, некоторые другие DLL для выхода, например, ucrtbase.dll. Нажмите «Новая / Точка останова функции», введите, например, «ExitProcess», нажмите ОК.
Вы также можете попробовать использовать инструмент gflags из Windows SDK.
Если вы обнаружите (прочитав «Журналы Windows> Приложение») причину самопроизвольного выхода, вы можете проверить «Включить сбор дампов» в gflags, тогда вы сможете загрузить дамп в WinDBG и получить полный стек вызовов, сообщающий вам кто назвал что.
К сожалению, последняя версия инструмента сломанный не поддающийся ремонту.
Но вы можете установить более старый Windows SDK. Оттуда вам нужны только «Средства отладки для Windows», нет необходимости устанавливать полный SDK.