知識マップ: Windowsアプリのクラッシュ時にログとダンプを残す設計

記事「Windowsアプリのクラッシュ時にログとダンプを残す設計」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。

Windowsアプリがプログラムミスによる例外で落ちても原因を追えるようにするには、落ちるプロセス自身のログだけに頼らず、通常時系列ログ・落ちる瞬間の最終クラッシュマーカー・WER LocalDumpsによるダンプという3層で証跡を分担する設計が有効である。AppDomain.UnhandledExceptionやWinFormsのThreadException、WPFのDispatcherUnhandledExceptionは見かけ上の延命に使うと危険で、記録の入口として使ったうえでEnvironment.FailFastのような即時終了APIで終了させる方が安全だが、UnhandledExceptionの中でFailFastを呼ぶとダンプの原因がすり替わってしまう。native C++ではSEHに加えてCRTの終了経路も押さえる必要があり、24時間稼働や装置制御が絡む場合は監視プロセスを足すとexit codeや再起動回数まで外部から検知できるようになる。

Windowsアプリのクラッシュ時ログ・ダンプ設計の知識マップ落ちるプロセスの中だけに証跡を期待しない設計が、通常ログ・最終クラッシュマーカー・WER LocalDumpsという3層の役割分担と、AppDomain.UnhandledExceptionやFailFastなど各種例外ハンドラの使い分け、監視プロセスによる外部からの検知で成り立つことを示す図前提とする前提とする前提とする前提とする前提とする推奨される対応より先に行うべき前提とする推奨される対応用いるのは非推奨用いるのは非推奨用いるのは非推奨利用する推奨される対応推奨される対応前提とする前提とするで確認できる実装を担う利用する利用するより先に行うべき実装を担う推奨される対応クラッシュ時のログ・証跡設計WER LocalDumps通常ログ(時系列ログ)最終クラッシュマーカーSEH(構造化例外処理)CRT/C++ランタイムの終了経路監視プロセス(watchdog)24/7運転・装置制御などの強めの要件次回起動後の後処理session IDによる証跡の突き合わせAppDomain.UnhandledExceptionApplication.ThreadException(WinForms)プログラムミス起点の想定外例外での処理継続Application.DispatcherUnhandledException(WPF)TaskScheduler.UnobservedTaskExceptionEnvironment.FailFastWindowsアプリケーションイベントログダンプ保存先フォルダのACLクラッシュダンプPDB(プログラムデータベース)WinDbgMiniDumpWriteDumpWerRegisterFileによるログ添付登録

概念間の関係(全24件)

図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。

主要概念の定義

クラッシュ時のログ・証跡設計
落ちるプロセスの中だけに証跡を期待せず、通常ログ・最終クラッシュマーカー・OS/別プロセス側の証跡に役割を分けて残す設計方針。
WER LocalDumps
WERがクラッシュ後にユーザーモードダンプをローカルへ保存するための、レジストリで設定する機能。追加ツールなしでアプリ単位の設定が可能。
監視プロセス(watchdog)
本体プロセスの起動・終了・生存を外から見張り、exit codeや再起動回数を記録する別プロセス。
最終クラッシュマーカー
多重突入を防ぎつつ1行だけ書いてflushし終了する、クラッシュ発生時専用の短い記録ファイル。原因の詳細ではなく入口の固定を目的とする。
Application.ThreadException(WinForms)
WinFormsのUIスレッドの未処理例外を拾い、Handled指定で見かけ上継続できてしまうイベント。
Application.DispatcherUnhandledException(WPF)
WPFのUIスレッドの未処理例外を拾い、Handled=trueにすると見かけ上継続できてしまうイベント。
TaskScheduler.UnobservedTaskException
Taskの例外取りこぼしを検知する補助イベント。クラッシュ時の確実な記録経路としては弱い。
Environment.FailFast
try/finallyとfinalizerを実行させずにプロセスを即座に終了させ、イベントログへの記録とダンプ採取を行う.NETのAPIのこと。
クラッシュダンプ
プロセスのメモリ内容・スタック情報・例外情報などをファイルへ書き出した、クラッシュ調査に使うスナップショットである。
MiniDumpWriteDump
UIからの診断情報保存や、ログ・独自メタデータの同梱など、自前のダンプ収集機能を実装するためのWin32 API。
WerRegisterFileによるログ添付登録
現在のログファイルをWERのエラーレポートに含めるための登録を行う仕組み。ローカル保存の代替ではなく追加導線として使う。

機械可読データ

このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。