Я пытаюсь поймать все необработанные исключения в моем приложении, чтобы сохранить файл журнала, когда они возникают. Это 64-битное приложение Windows, скомпилированное с использованием Visual Studio 2013, написанное на C++. Для тестирования я использую проект C++ Win32 по умолчанию, сгенерированный VS.Нарушение прав доступа в Windows
Я занимаюсь всеми исключениями, зарегистрировав обработчик с помощью SetUnhandledExceptionFilter. Это отлично работает для/большинства/случаев, но не для всех. За исключением всех исключений throw() - n и большинства аппаратных исключений, таких как с плавающей запятой или нарушениями доступа. Код, который не вызывает обработчик:
std::vector<int> foo(5, 0);
for (auto& f : foo)
foo.erase(foo.begin() + 1);
Вместо этого я просто получить стандартное диалоговое окно окна аварии, без моего обработчика исключений вызывались. Если я запустил его в Visual Studio с прикрепленным отладчиком, он правильно сообщает об исключении нарушения доступа. Другие типы нарушений доступа также запускают обработчик:
Код выше запускает обработчик исключений.
Я также попытался использовать сигнал try/catch или catch SIGSEGV, но ни один из них не запускается с первым примером. сигналы прерывания/завершения не вызываются. Короче говоря, я никоим образом не уведомляюсь, когда это происходит.
Я хочу знать, есть ли способ получить какое-то уведомление в моем приложении до того, как он завершится сбой из-за нарушения доступа, вызванного первым примером? Поскольку VS, похоже, способен его обнаружить, я предполагаю, что есть способ.
EDIT: Я просто хочу, чтобы все было ясно. Я запускаю код в режиме деблокирования, а ошибка в первом примере не вызвана проверкой итератором вне границ, выполненной в режиме отладки.
EDIT2: Я включил простейший пример, я могу придумать консольное приложение win32. См. Его здесь: http://pastebin.com/8L1SN5PQ
Обязательно запустите его в режиме деблокирования без прикрепленного отладчика.
Вам нужно найти исключения SEH. Это не случаи, когда применяются обычные исключения C++. –
Я пробовал. Использование SEH __try/__, за исключением того, что SEH включен в Visual Studio, дает тот же результат. Первый пример не вызывает исключение, второе - делает. – Uberyon
Поскольку, как говорит Ханс, это не очень хорошая идея, я больше не буду тратить время на то, чтобы помочь вам это сделать. Вместо этого: если вы отлаживаете, запустите приложение в сборке отладки и используйте средства для его отладки до тех пор, пока не будет ошибок. Если это живое приложение, и вы пытаетесь отладить случайный крах, подумайте о развертывании отладочной сборки или использовании телеметрических служб. – Ben