知識マップ: Time Travel Debugging ── 長期稼働で再現しない不具合を「録画」して巻き戻す
記事「Time Travel Debugging ── 長期稼働で再現しない不具合を「録画」して巻き戻す」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。
Time Travel Debugging(TTD)は、プロセスの命令実行を丸ごと録画してあとから前後に再生できるWinDbgの機能で、録画は管理者権限を要する操作で、記録した命令実行は.runトレースファイルに保存され、WinDbgが再生用にインデックスファイル(.idx)を作って使います。録画は5〜20倍の速度低下とトレースの肥大化を招くため、TTD.exeのリングバッファ(-ring / -maxFile)・モジュール限定(-module)・手動録画(-recordmode Manual)・監視モード(-monitor)で録る範囲を構成し、リングバッファとモジュール限定は肥大化を、モジュール限定と手動録画はオーバーヘッドを軽減します。いつ起きるか分からない長期稼働の不具合にはリングバッファを、起動時や特定の起動でだけ出る断続的な不具合には監視モードを勧めます。再生ではトレース内の位置を単位に移動し、TTD.Eventsで例外の位置を確認し、TTD.Memoryとアクセスブレークポイント(ba)からの逆方向実行(g-)でデータ破壊を書いた命令まで遡り、TTD.Callsでハンドルリークの取得・解放やハングの待機呼び出しを確認できますが、TTD.Callsで正しい引数と戻り値を読むにはprivate symbolsを用意することを勧めます。64ビットのSOS拡張を組み合わせれば.NETアプリのマネージド状態も読めます。トレースはメモリ内容を含むため情報漏えいの原因になり得て、保護されたプロセス(PPL)は録画できず、Application Verifierを有効にしたままの録画は再生が遅くなるので勧めません。採取コストの低いダンプ解析を先に行い、経路が要ると分かった案件にTTDを出す順序を勧めます。
flowchart LR
accTitle: Time Travel Debuggingの知識マップ
accDescr: Time Travel Debugging(TTD)がWinDbgを前提とし、管理者権限を要する録画で命令実行を.runトレースに記録し、TTD.exeがリングバッファ・モジュール限定・手動録画・監視モードで録画範囲を構成すること、録画のオーバーヘッドとトレースの肥大化をそれらが軽減すること、再生ではTTD.Events・TTD.Calls・TTD.Memoryとアクセスブレークポイント・逆方向実行で例外やデータ破壊・ハンドルリーク・ハングを確認できること、トレースが情報漏えいの原因になり得ること、PPLと両立しないこと、Application Verifier併用が非推奨なこと、ダンプ解析を先に行うべきことを示した図
time_travel_debugging["Time Travel Debugging(TTD)"]
windbg["WinDbg"]
ttd_recording["TTDの録画"]
admin_rights["管理者権限"]
ttd_trace_file["TTDトレースファイル(.run)"]
ttd_index_file["TTDインデックスファイル(.idx)"]
ttd_exe["TTD.exe(コマンドライン録画ツール)"]
ttd_position["TTDの位置(position)"]
ttd_recording_overhead["TTD録画のオーバーヘッド"]
ttd_trace_growth["TTDトレースの肥大化"]
ttd_ring_buffer["TTDのリングバッファ録画(-ring / -maxFile)"]
ttd_module_filter["TTDのモジュール限定録画(-module)"]
ttd_manual_record_mode["TTDの手動録画(-recordmode Manual)"]
ttd_monitor_mode["TTDの監視モード(-monitor)"]
long_run_crash_investigation["長時間運転後クラッシュの切り分け"]
intermittent_failure["断続的・再現しない不具合"]
exception["例外(exception)"]
ttd_events_query["TTD.Events(イベント一覧)"]
data_corruption["データ破壊(不正な値の書き込み)"]
ttd_memory_query["TTD.Memoryクエリ"]
reverse_execution["逆方向実行(g- / p- / t-)"]
break_on_access["アクセスブレークポイント(ba)"]
private_symbols["private symbols"]
ttd_calls_query["TTD.Callsクエリ"]
handle_leak["ハンドルリーク"]
application_hang["アプリケーションのハング(応答なし)"]
information_leakage["情報漏えい"]
protected_process_light["保護されたプロセス(PPL)"]
application_verifier["Application Verifier"]
dump_analysis["ダンプ解析"]
sos_extension["SOS拡張"]
time_travel_debugging -->|"前提とする"| windbg
time_travel_debugging -->|"利用する"| ttd_recording
ttd_recording -->|"前提とする"| admin_rights
ttd_recording -->|"に保存される"| ttd_trace_file
windbg -->|"利用する"| ttd_index_file
ttd_exe -->|"実装を担う"| ttd_recording
time_travel_debugging -->|"利用する"| ttd_position
ttd_recording -->|"原因になり得る"| ttd_recording_overhead
ttd_recording -->|"原因になり得る"| ttd_trace_growth
ttd_exe -->|"で構成できる"| ttd_ring_buffer
ttd_exe -->|"で構成できる"| ttd_module_filter
ttd_exe -->|"で構成できる"| ttd_manual_record_mode
ttd_exe -->|"で構成できる"| ttd_monitor_mode
ttd_ring_buffer -->|"軽減する"| ttd_trace_growth
ttd_module_filter -->|"軽減する"| ttd_recording_overhead
ttd_module_filter -->|"軽減する"| ttd_trace_growth
ttd_manual_record_mode -->|"軽減する"| ttd_recording_overhead
ttd_ring_buffer -.->|"推奨される対応"| long_run_crash_investigation
ttd_monitor_mode -.->|"推奨される対応"| intermittent_failure
time_travel_debugging -.->|"推奨される対応"| intermittent_failure
exception -->|"で確認できる"| ttd_events_query
data_corruption -->|"で確認できる"| ttd_memory_query
data_corruption -.->|"で確認できる"| reverse_execution
break_on_access -->|"より先に行うべき"| reverse_execution
private_symbols -->|"推奨される対応"| ttd_calls_query
handle_leak -.->|"で確認できる"| ttd_calls_query
application_hang -.->|"で確認できる"| ttd_calls_query
ttd_trace_file -.->|"原因になり得る"| information_leakage
ttd_recording -->|"両立しない"| protected_process_light
application_verifier -->|"用いるのは非推奨"| ttd_recording
dump_analysis -->|"より先に行うべき"| time_travel_debugging
time_travel_debugging -.->|"利用する"| sos_extension
概念間の関係(全32件)
図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。
- Time Travel Debugging(TTD)はWinDbgを前提とします。
- Time Travel Debugging(TTD)はTTDの録画を利用します。
- TTDの録画は管理者権限を前提とします。
- TTDの録画はTTDトレースファイル(.run)に保存されます。
- WinDbgはTTDインデックスファイル(.idx)を利用します。
- TTD.exe(コマンドライン録画ツール)はTTDの録画の実装を担います。
- Time Travel Debugging(TTD)はTTDの位置(position)を利用します。
- TTDの録画はTTD録画のオーバーヘッドの原因になることがあります。
- TTDの録画はTTDトレースの肥大化の原因になることがあります。
- TTD.exe(コマンドライン録画ツール)はTTDのリングバッファ録画(-ring / -maxFile)で構成できます。
- TTD.exe(コマンドライン録画ツール)はTTDのモジュール限定録画(-module)で構成できます。
- TTD.exe(コマンドライン録画ツール)はTTDの手動録画(-recordmode Manual)で構成できます。
- TTD.exe(コマンドライン録画ツール)はTTDの監視モード(-monitor)で構成できます。
- TTDのリングバッファ録画(-ring / -maxFile)はTTDトレースの肥大化を軽減します。
- TTDのモジュール限定録画(-module)はTTD録画のオーバーヘッドを軽減します。
- TTDのモジュール限定録画(-module)はTTDトレースの肥大化を軽減します。
- TTDの手動録画(-recordmode Manual)はTTD録画のオーバーヘッドを軽減します。
- TTDのリングバッファ録画(-ring / -maxFile)は長時間運転後クラッシュの切り分けに対する本記事の推奨です。
- TTDの監視モード(-monitor)は断続的・再現しない不具合に対する本記事の推奨です。
- Time Travel Debugging(TTD)は断続的・再現しない不具合に対する本記事の推奨です。
- 例外(exception)はTTD.Events(イベント一覧)で確認できます。
- データ破壊(不正な値の書き込み)はTTD.Memoryクエリで確認できます。
- データ破壊(不正な値の書き込み)は逆方向実行(g- / p- / t-)で確認できます。
- アクセスブレークポイント(ba)は逆方向実行(g- / p- / t-)より先に行うべきです。
- private symbolsはTTD.Callsクエリに対する本記事の推奨です。
- ハンドルリークはTTD.Callsクエリで確認できます。
- アプリケーションのハング(応答なし)はTTD.Callsクエリで確認できます。
- TTDトレースファイル(.run)は情報漏えいの原因になることがあります。
- TTDの録画は保護されたプロセス(PPL)と両立しません。
- Application VerifierをTTDの録画に用いることは推奨されません。
- ダンプ解析はTime Travel Debugging(TTD)より先に行うべきです。
- Time Travel Debugging(TTD)はSOS拡張を利用します。
主要概念の定義
機械可読データ
このデータセットについて
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。