知識マップ: Windowsアプリのクラッシュ時にログとダンプを残す設計
記事「Windowsアプリのクラッシュ時にログとダンプを残す設計」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。
Windowsアプリがプログラムミスによる例外で落ちても原因を追えるようにするには、落ちるプロセス自身のログだけに頼らず、通常時系列ログ・落ちる瞬間の最終クラッシュマーカー・WER LocalDumpsによるダンプという3層で証跡を分担する設計が有効である。AppDomain.UnhandledExceptionやWinFormsのThreadException、WPFのDispatcherUnhandledExceptionは見かけ上の延命に使うと危険で、記録の入口として使ったうえでEnvironment.FailFastのような即時終了APIで終了させる方が安全だが、UnhandledExceptionの中でFailFastを呼ぶとダンプの原因がすり替わってしまう。native C++ではSEHに加えてCRTの終了経路も押さえる必要があり、24時間稼働や装置制御が絡む場合は監視プロセスを足すとexit codeや再起動回数まで外部から検知できるようになる。
flowchart LR
accTitle: Windowsアプリのクラッシュ時ログ・ダンプ設計の知識マップ
accDescr: 落ちるプロセスの中だけに証跡を期待しない設計が、通常ログ・最終クラッシュマーカー・WER LocalDumpsという3層の役割分担と、AppDomain.UnhandledExceptionやFailFastなど各種例外ハンドラの使い分け、監視プロセスによる外部からの検知で成り立つことを示す図
crash_time_logging_design["クラッシュ時のログ・証跡設計"]
wer_localdumps["WER LocalDumps"]
application_log["通常ログ(時系列ログ)"]
fatal_crash_marker["最終クラッシュマーカー"]
seh["SEH(構造化例外処理)"]
crt_termination_handler["CRT/C++ランタイムの終了経路"]
watchdog_process["監視プロセス(watchdog)"]
high_reliability_operation_requirement["24/7運転・装置制御などの強めの要件"]
post_restart_processing["次回起動後の後処理"]
session_id_correlation["session IDによる証跡の突き合わせ"]
dotnet_unhandledexception["AppDomain.UnhandledException"]
winforms_threadexception["Application.ThreadException(WinForms)"]
unexpected_exception_continuation["プログラムミス起点の想定外例外での処理継続"]
wpf_dispatcherunhandledexception["Application.DispatcherUnhandledException(WPF)"]
unobserved_task_exception["TaskScheduler.UnobservedTaskException"]
environment_failfast["Environment.FailFast"]
windows_application_event_log["Windowsアプリケーションイベントログ"]
dump_folder_acl["ダンプ保存先フォルダのACL"]
crash_dump["クラッシュダンプ"]
pdb["PDB(プログラムデータベース)"]
windbg["WinDbg"]
minidumpwritedump["MiniDumpWriteDump"]
wer_file_registration["WerRegisterFileによるログ添付登録"]
crash_time_logging_design -->|"前提とする"| application_log
crash_time_logging_design -->|"前提とする"| fatal_crash_marker
crash_time_logging_design -->|"前提とする"| wer_localdumps
crash_time_logging_design -.->|"前提とする"| seh
crash_time_logging_design -.->|"前提とする"| crt_termination_handler
watchdog_process -->|"推奨される対応"| high_reliability_operation_requirement
fatal_crash_marker -->|"より先に行うべき"| post_restart_processing
fatal_crash_marker -.->|"前提とする"| session_id_correlation
fatal_crash_marker -->|"推奨される対応"| dotnet_unhandledexception
winforms_threadexception -->|"用いるのは非推奨"| unexpected_exception_continuation
wpf_dispatcherunhandledexception -->|"用いるのは非推奨"| unexpected_exception_continuation
unobserved_task_exception -->|"用いるのは非推奨"| fatal_crash_marker
environment_failfast -->|"利用する"| windows_application_event_log
fatal_crash_marker -->|"推奨される対応"| seh
fatal_crash_marker -->|"推奨される対応"| crt_termination_handler
wer_localdumps -.->|"前提とする"| dump_folder_acl
crash_dump -.->|"前提とする"| pdb
crash_dump -->|"で確認できる"| windbg
minidumpwritedump -->|"実装を担う"| crash_dump
watchdog_process -.->|"利用する"| minidumpwritedump
wer_file_registration -->|"利用する"| application_log
wer_localdumps -->|"より先に行うべき"| wer_file_registration
wer_localdumps -->|"実装を担う"| crash_dump
fatal_crash_marker -->|"推奨される対応"| winforms_threadexception
概念間の関係(全24件)
図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。
- クラッシュ時のログ・証跡設計は通常ログ(時系列ログ)を前提とします。
- クラッシュ時のログ・証跡設計は最終クラッシュマーカーを前提とします。
- クラッシュ時のログ・証跡設計はWER LocalDumpsを前提とします。
- クラッシュ時のログ・証跡設計はSEH(構造化例外処理)を前提とします。
- クラッシュ時のログ・証跡設計はCRT/C++ランタイムの終了経路を前提とします。
- 監視プロセス(watchdog)は24/7運転・装置制御などの強めの要件に対する本記事の推奨です。
- 最終クラッシュマーカーは次回起動後の後処理より先に行うべきです。
- 最終クラッシュマーカーはsession IDによる証跡の突き合わせを前提とします。
- 最終クラッシュマーカーはAppDomain.UnhandledExceptionに対する本記事の推奨です。
- Application.ThreadException(WinForms)をプログラムミス起点の想定外例外での処理継続に用いることは推奨されません。
- Application.DispatcherUnhandledException(WPF)をプログラムミス起点の想定外例外での処理継続に用いることは推奨されません。
- TaskScheduler.UnobservedTaskExceptionを最終クラッシュマーカーに用いることは推奨されません。
- Environment.FailFastはWindowsアプリケーションイベントログを利用します。
- 最終クラッシュマーカーはSEH(構造化例外処理)に対する本記事の推奨です。
- 最終クラッシュマーカーはCRT/C++ランタイムの終了経路に対する本記事の推奨です。
- WER LocalDumpsはダンプ保存先フォルダのACLを前提とします。
- クラッシュダンプはPDB(プログラムデータベース)を前提とします。
- クラッシュダンプはWinDbgで確認できます。
- MiniDumpWriteDumpはクラッシュダンプの実装を担います。
- 監視プロセス(watchdog)はMiniDumpWriteDumpを利用します。
- WerRegisterFileによるログ添付登録は通常ログ(時系列ログ)を利用します。
- WER LocalDumpsはWerRegisterFileによるログ添付登録より先に行うべきです。
- WER LocalDumpsはクラッシュダンプの実装を担います。
- 最終クラッシュマーカーはApplication.ThreadException(WinForms)に対する本記事の推奨です。
主要概念の定義
機械可読データ
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。