Перерыв в Visual Studio при выходе из процесса

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

Я попытался установить функцию std::atexit, но это не помогло ударять. Я также пытался переопределить SetUnhandledExceptionFilter< /a>, если это вызвано сбоем, а также не попало. В проекте отключены исключения (#define _HAS_EXCEPTIONS=0), поэтому я не могу вызвать std::set_terminate или std::set_unexpected.

Есть ли другой способ определить, что вызывает выход процесса? Какой-то вариант сломать отладчик, когда процесс вот-вот завершится?


person MuertoExcobito    schedule 14.09.2017    source источник
comment
Я не очень специалист... Отладчик пошагово не поможет? Если не помогает изобразить последовательность операций во времени, используйте printf(1) printf(2) в коде ecc, чтобы определить, где код не выполняется.   -  person RosLuP    schedule 14.09.2017
comment
Исключение отключено настройками проекта (C/C++-›Code Generation), а не #define. Так что Debug->Windows->Exception Settings может быть полезным.   -  person KonstantinL    schedule 14.09.2017
comment
или добавьте try{}catch{...} в свой main, и тогда даже без настроек отладчика вы сможете увидеть, является ли это неперехваченным исключением с точкой останова.   -  person UKMonkey    schedule 14.09.2017
comment
@UKMonkey - внутри main уже есть блок __try/__finally, а блок __finally не попадает.   -  person MuertoExcobito    schedule 14.09.2017
comment
atexit запускается только при обычном завершении; поэтому я не удивлен, что мне не звонят. Я хотел бы добавить несколько обработчиков сигналов en.cppreference.com/w/cpp/ утилита/программа/сигнал, чтобы можно было хотя бы отслеживать, что происходит.   -  person UKMonkey    schedule 14.09.2017
comment
Аналогичный случай: stackoverflow.com/a/28323007/17034   -  person Hans Passant    schedule 14.09.2017
comment
@HansPassant - судя по этому ответу, моя машина вот-вот вылетит в окно :). Пробовал точки останова на ExitProcess, TerminateProcess, NtTerminateProcess (у меня тоже не работал контекстно-зависимый) и _exit. В окне точек останова все говорят, что они действительны, но ни одна из них не срабатывает после пошагового выполнения.   -  person MuertoExcobito    schedule 14.09.2017
comment
@UKMonkey — добавлен обработчик сигнала для 1..NSIG, но обработчик сигнала тоже не срабатывает.   -  person MuertoExcobito    schedule 14.09.2017
comment
Мои последние предположения заключаются в том, что вы создаете что-то в режиме выпуска или есть какая-то несоответствующая отладочная информация... после этого у меня нет идей :)#   -  person UKMonkey    schedule 14.09.2017
comment
Отладка сборки, и, как я уже сказал, точки останова говорят, что они совпадают в окне отладки, чего не произошло бы, если бы отладочная информация не совпадала.   -  person MuertoExcobito    schedule 14.09.2017


Ответы (2)


Запустите приложение с помощью отладчика и прочитайте вывод отладки. Если приложение завершает работу из-за исключений C++ или SEH, вы прочитаете это в окне вывода.

Если вы не увидите там ничего интересного, значит, ваше приложение называется ExitProcess/ExitThread/exit или, что еще хуже, TerminateProcess/TerminateThread/_exit.

На них можно поставить точки останова. Установите точку останова при запуске, запустите отладчик. Убедитесь, что у вас есть символы отладки, загруженные для соответствующих DLL, kernel32.dll для ExitProcess и других, некоторые другие DLL для выхода, например. ucrtbase.dll. Нажмите «Новая / функция точки останова» в окне «Точки останова», введите, например. «Выход из процесса», нажмите ОК.

person Soonts    schedule 14.09.2017
comment
Хотя это разумный ответ... у меня он не работает (см. комментарии к вопросу). - person MuertoExcobito; 14.09.2017
comment
Отличный совет! Спасибо! - person RED SOFT ADAIR; 13.08.2018