プログラミング

例外時にMiniDumpを出力するWatchdogサンプル

構造化例外などの発生時に、例外が発生したプロセスとは別のプロセスでミニダンプを出力するプログラムを作成してみました。

GitHub - fuket/ProcessWatchdog: Watchdog sample to generate minidump
GitHub - fuket/ProcessWatchdog: Watchdog sample to generate minidump

Watchdog sample to generate minidump. Contribute to fuket/ProcessWatchdog development by creating an ...

github.com

クラッシュしたプロセス内でダンプを出力するのはやったことがあったのですが、10回に一回くらいダンプ出力時にハングアップしてしまう状況でした。
WinDbgで調べてみると、以下に書かれているとおりのデッドロックが発生しているようだったので、だめだこりゃとなって今回作成に至りました。

MiniDumpWriteDump should be called from a separate process if at all possible, rather than from within the target process being dumped. This is especially true when the target process is already not stable. For example, if it just crashed. A loader deadlock is one of many potential side effects of calling MiniDumpWriteDump from within the target process.

MiniDumpWriteDump function (minidumpapiset.h) - Win32 apps | Microsoft Learn

使い方ですが、CrashAppとProcessWatchdogの両方を起動した状態でCrashAppで"Enter"を押下し、0割の構造化例外を発生させると、ProcessWatchdogにウィンドウメッセージが飛んでMiniDumpWriteDump関数でダンプファイルが生成されます。

出力されたダンプファイルは、WinDbgでデバッグできます。落ちた場所が簡単にわかるのでデバッグやログ解析も楽々ですね!

参考にしたサイトは以下のとおりです。
https://stackoverflow.com/questions/13590980/how-do-i-get-at-the-exception-information-when-using-minidumpwritedump-out-of-pr
https://stackoverflow.com/questions/16147753/trouble-passing-exception-pointers-using-filemapping

-プログラミング