Я пытаюсь добавить функциональность захвата мини-дампов, когда моя программа падает. Из того, что я прочитал, это лучше всего достигается с помощью другого приложения (сторожевого таймера), которое используется для размещения реального приложения и выполнения дампа.
Из просмотра таких сообщений, как этот, Я придумал следующее (и App, и WatchDog реализованы на C ++ с использованием Win32):
Когда сторожевой таймер запускается, он создает 2 события, ExitedOk событие, и исключение событие, оба из которых установлены как наследуемые и не сигнализируются. Он также создает наследуемое сопоставление файлов.
Затем сторожевой таймер запускает «настоящее приложение» и ожидает WaitOnMultipleObjects для любого ExitedOk или же исключение быть сигнализированным.
Когда приложение запускается, оно создает те же 2 события (оно наследует дескрипторы)
Приложение настроено так, что если оно выходит нормально, оно сигнализирует ExitedOk, или если происходит необработанное исключение, оно сохраняет информацию об исключении / потоке, используя унаследованное сопоставление файлов, сигналы исключение, а потом спит (бесконечно).
Если WaitOnMultipleObjects в сторожевом таймере сигнализируется с помощью ExitedOk, Ничего не произошло. Если это сигнализируется с исключение, затем он читает информацию об исключении / потоке, используя сопоставление файлов, а затем вызывает MiniDumpWriteDump.
Очевидно, что Sleep () является проблемой. Это лучше всего решается с помощью другого события? Так что приложение ждет, пока сторожевой таймер не сообщит о каком-либо событии «FinishedCreatingDump»?
Во-вторых, я подумал, что весь смысл сторожевого таймера заключался в том, что вы не выполняли какую-либо работу в аварийном процессе, которая потенциально нестабильна? Если я правильно понимаю рабочий процесс и что вам действительно нужен SetEvent / OpenFileMapping / MapViewOfFile в процессе, который фактически завершился с ошибкой, разве это не так плохо, как вызов MiniDumpWriteDump из него?
Задача ещё не решена.
Других решений пока нет …