При использовании функции MiniDumpWriteDump для создания дампа ядра процесса в Windows рекомендуется (например, Вот, а также Вот) что MiniDumpWriteDump
запускается из другого «сторожевого» процесса, потому что он может не работать при вызове из того же процесса.
На данный момент наше приложение является вызывая его в процессе обработки необработанного исключения (мы делаем это из сторожевого потока). Поскольку у нас иногда возникают проблемы, когда он не работает, мы бы хотели перенести его в отдельный процесс.
Теперь сигнал другому процессу начать запись дампа тривиален (просто используйте событие, семафор, назовите его), но как мне передать LPEXCEPTION_POINTERS
информация, которую я получаю для функции обратного вызова, которую я регистрирую SetUnhandledExceptionFilter
в другой процесс, чтобы он мог быть передан MiniDumpWriteDump
s ExceptionParam
аргумент ??
Вам также необходимо значение MINIDUMP_EXCEPTION_INFORMATION.ThreadId. Самый простой способ, и способ, которым я сделал это, состоит в том, чтобы использовать отображенный в памяти файл для передачи обоих ThreadId и ExceptionPointers. И названное событие, чтобы разбудить сторожевого пса. Неважно, что указатель недопустим в контексте сторожевого процесса.
Используйте CreateFileMapping + MapViewOfFile в наблюдаемом процессе как часть его инициализации, OpenFileMapping + MapViewOfFile в наблюдателе. Затем ваш SetUnhandledExceptionFilter должен только вызывать GetCurrentThreadId () и копировать tid и pExcept в представление файла, отображенного в памяти, вызывать SetEvent (), чтобы разбудить сторожевой таймер и заблокировать его до тех пор, пока сторожевой таймер не завершит его.
Других решений пока нет …