Time Travel Debugging - 概要
タイム トラベル デバッグとは
タイム トラベル デバッグとは、プロセス実行時にプロセスのトレースをキャプチャし、後で前後方向に再生できるツールです。 タイム トラベル デバッグ (TTD) を使用すると、バグが見つかるまで問題を再現する代わりに、デバッガー セッションを "巻き戻す" ことができるため、問題のデバッグが容易になります。
TTD を使用することで、過去を遡ってバグに至った状況をよりよく理解でき、何度も再生してその問題を解決するための最善の方法を学習できます。
TTD には、最終的なエラーに至った状態や実行パスを見落しがちである、クラッシュ ダンプ ファイルよりも利点があります。
自分自身で問題を見つけ出せない場合には、同僚とトレースを共有し、自分が見ているのとまったく同じものを確認してもらえます。 これにより、ライブ デバッグよりも簡単にコラボレーションできます。記録されている手順は同じですが、PC ごとに別のアドレスの場所とコード実行を見られるからです。 また、同僚がどこから着手すればよいのかを把握できるように、特定の時点を共有することできます。
TTD は効率的です。トレース ファイル内のコード実行をキャプチャするので、動作時のオーバーヘッドは最小限に抑えられます。
TTD には、LINQ を使用してトレースにクエリを実行できるデバッガー データ モデル オブジェクトのセットが付属します。 たとえば、TTD オブジェクトを使用して、特定のコード モジュールが読み込まれたタイミングを特定したり、すべての例外を見つけたりできます。
要件
タイム トラベル デバッグは、WinDbg と統合されているので、シームレスに記録と再生を行えます。
TTD を使用するには、管理者特権でデバッガーを実行する必要があります。 管理者特権を持つアカウントを使用して WinDbg をインストールし、デバッガーで記録するときには、そのアカウントを使用します。 デバッガーを管理者特権で実行するには、スタート メニューで WinDbg アイコンを長押し (または右クリック) し、[ 管理者として実行>を選択します。
リリース ノート
TTD は進化を続けています。最新情報については、 Time travel debugging リリース ノートを参照してください。
記録には、個人を特定できる、またはセキュリティに関連する情報が含まれている場合があります
記録を含む作成されたトレース ファイルには、ファイル パス、レジストリ、メモリ、またはファイルの内容など、個人を特定できる情報やセキュリティ関連の情報が含まれている場合があります。ただし、必ずしもこれらに限定されるわけではありません。 正確な情報は、記録中のターゲット プロセス アクティビティによって異なります。 記録ファイルを他のユーザーと共有する場合は、この点に注意してください。
TTD.exe コマンド ライン記録ユーティリティ
トレースの記録には WinDbg UI でなく、TTD.exe コマンド ライン ユーティリティを使用することもできます。
TTD コマンド ライン レコーダーのみが必要となるシナリオもあり得ます (デバッガーをインストールしない状態での PC への記録、高度な記録シナリオ、テスト自動化など)。これらのシナリオでは、URL を介して TTD コマンド ライン レコーダーのみをインストールできます。 詳細については、「タイム トラベル デバッグ - TTD.exe コマンド ライン ユーティリティ」を参照してください。
デバッグ ツールの比較
次の表は、利用可能なさまざまなデバッグ ソリューションの長所と短所をまとめたものです。
アプローチ | 長所 | デメリット |
---|---|---|
ライブ デバッグ | 対話型エクスペリエンス、実行フローの確認、ターゲット状態の変更が可能で、使い慣れたツールを使い慣れた環境で使用できます。 | ユーザー エクスペリエンスを中断して問題を繰り返し再現する作業が必要になる場合があり、セキュリティに影響する可能性があるので、実稼働システムでは常に選択できるとは限りません。 再現では、エラー発生時点から遡って原因を特定するのは困難です。 |
ダンプ | 事前のコーディングが不要で、割り込みが少なく、トリガーに基づきます。 | 連続するスナップショットまたはライブ ダンプで提供されるのは、シンプルな "経過時間" 表示です。 使用しない場合のオーバーヘッドは基本的にゼロです。 |
テレメトリ & ログ | 軽量で、多くの場合ビジネス シナリオやユーザー操作に関連付けられ、機械学習との相性に優れます。 | 予期しないコード パス (テレメトリなし) で問題が発生します。 データの深さに欠け、コードへ静的にコンパイルされます。 |
タイム トラベル デバッグ (TTD) | 複雑なバグに強く、事前のコーディングが不要で、オフラインでデバッグを反復可能で、分析しやすく、何でもキャプチャできます。 | 記録時に大きなオーバーヘッドが生じます。 必要以上のデータが収集される場合があります。 データ ファイルが大きくなる可能性があります。 |
ビデオ トレーニング
TTD の詳細については、これらのビデオを参照してください。
デフラグ ツール 185 - Ivette と James による TTD の基礎に関する解説と WinDbg のいくつかの機能のデモ
デフラグ ツール 186 - Jordi と JCAB による WinDbg が搭載するその他の優れた TTD 機能のデモ
CppCon (YouTube) - Jordi、Ken、James が CppCon 2017 で行った WinDbg での TTD のプレゼンテーション
トレース ファイルの基礎
トレース ファイルのサイズ
トレース ファイルは大きくなる可能性があり、TTD を使用する際には使用可能な空き領域が十分にあることを確認する必要があります。 ほんの数分間でもプログラムを記録すると、トレース ファイルがあっという間に数ギガバイトに達する可能性もあります。 TTD では、複雑な実行時間の長いシナリオを可能にするトレース ファイルの最大サイズは設定されません。 問題をすばやく再作成することで、トレース ファイルのサイズを可能な限り小さく抑えられます。
トレース ファイルとインデックス ファイル
トレース ファイル (.run
) には、記録中のコード実行が格納されます。
記録が停止されると、トレース情報へのアクセスを最適化するためにインデックス ファイル (.idx
) が作成されます。 また、WinDbg でトレース ファイルが開かれると、自動的にインデックス ファイルも作成されます。
インデックス ファイルも大きくなる可能性があり、通常はトレース ファイルの 2 倍の大きさになります。
!tt.index
コマンドを使用して、トレース ファイルからインデックス ファイルを再作成できます。
0:000> !tt.index
Successfully created the index in 10ms.
記録エラーと記録のその他の出力は、WinDbg ログ ファイルに書き込まれます。
すべての出力ファイルは、ユーザーが構成した場所に格納されます。 既定の場所は、ユーザーのドキュメント フォルダーです。 たとえば User1 の場合、TTD ファイルは以下の場所に格納されます。
C:\Users\User1\Documents
トレース ファイルの操作の詳細については、「タイム トラベル デバッグ - トレース ファイルの操作」を参照してください。
注意事項
ウイルス対策との非互換性
TTD が記録のためにプロセスにフックする方法が原因で、非互換性が発生することがあります。 この問題は通常、システム メモリ呼び出しの追跡とシャドウ処理を試みるウイルス対策ソフトウェアやその他のシステム ソフトウェアによって発生します。 アクセス許可の不足を示すメッセージなど、記録に関する問題が発生した場合は、ウイルス対策ソフトウェアを一時的に無効にしてみてください。
メモリ アクセスのブロックを試みるその他のユーティリティによっても、問題が発生する可能性があります。Microsoft Enhanced Mitigation Experience Toolkit は、その一例です。
TTD と競合する環境のもう 1 つの例が、Electron アプリケーション フレームワークです。 このケースでは、トレースは記録できますが、記録されているプロセスのデッドロックまたはクラッシュが発生する可能性もあります。
ユーザー モード限定
現在 TTD では、ユーザー モードでの操作のみがサポートされているため、カーネル モードのプロセスはトレースできません。
読み取り専用再生
時間を遡ることができますが、履歴は変更できません。 メモリを読み取るコマンドは使用できますが、メモリを変更したりメモリに書き込んだりするコマンドは使用できません。
システム保護プロセス
Protected Process Light (PPL) プロセスなど、Windows システムで保護された一部のプロセスでは、TTD は、保護されたプロセスに侵入してコード実行を記録することができません。
記録がパフォーマンスに及ぼす影響
アプリケーションやプロセスを記録すると、PC のパフォーマンスに影響します。 実際のパフォーマンスのオーバーヘッドは、記録中に実行されるコードの量と種類によって異なります。 一般的な記録シナリオでは、パフォーマンスへの影響が約 10 倍から 20 倍になることが見込まれます。 UI で顕著な速度低下が発生しないことがあります。 ただし、[ファイルを開く] ダイアログなどのリソースを集中的に使用する操作では、記録の影響が表示されます。
トレース ファイル エラー
一部のケースでは、トレース ファイル エラーが発生する可能性があります。 詳細については、「タイム トラベル デバッグ - トラブルシューティング」を参照してください。
タイム トラベル デバッグの高度な機能
タイムライン
タイムラインは、実行中に発生するイベントをビジュアル的に表現したものです。 イベントとして表示される場所は、ブレークポイント、メモリの読み取り/書き込み、関数の呼び出しと戻り、例外などがあり得ます。 タイムラインの詳細については、「WinDbg - タイムライン」を参照してください。
デバッガー データ モデルのサポート
- 組み込みデータ モデルのサポート - TTD はデータ モデルをサポートしています。 LINQ クエリを使用したアプリケーション エラーの分析は、強力なツールになる可能性があります。 WinDbg のデータ モデル ウィンドウを使用すれば、展開可能で参照可能なバージョンの "dx" と "dx -g" を扱えるので、NatVis、JavaScript、LINQ クエリを使用するテーブルを作成できます。
デバッガー データ モデルの一般的な情報については、「WinDbg - データ モデル」を参照してください。 TTD デバッガー オブジェクト モデルの操作の詳細については、「タイム トラベル デバッグ - タイム トラベル デバッグ オブジェクトの概要」を参照してください。
スクリプトのサポート
- スクリプトの自動化 - JavaScript と NatVis のスクリプトがサポートされているので、問題の調査を自動化できます。 詳細については、「タイム トラベル デバッグ - JavaScript オートメーション」を参照してください。
JavaScript と NatVis の操作に関する一般的な情報については、「WinDbg - スクリプト」を参照してください。
TTD.exe コマンド ライン ユーティリティ
TTD.exe コマンド ライン ユーティリティでトレースを記録できます。 詳細については、「タイム トラベル デバッグ - TTD.exe コマンド ライン ユーティリティ」を参照してください。
マネージド コード TTD のサポート
WinDbg で、64 ビット モードで実行されている SOS デバッグ拡張機能 (sos.dll) を使用して、TTD でマネージド コードをデバッグできます。 詳細については、「Windows デバッガーを使用したマネージド コードのデバッグ」を参照してください。
TTD の使用を開始する
トレース ファイルの記録と再生や、トレース ファイルの操作とトラブルシューティングについては、以下のトピックをご覧ください。
- タイム トラベル デバッグ - トレースの記録
- Time Travel Debugging - トレースの再生
- タイム トラベル デバッグ - トレース ファイルの操作
- Time Travel Debugging - トラブルシューティング
- Time Travel Debugging - サンプル アプリのチュートリアル
これらのトピックでは、タイム トラベル デバッグのその他の高度な機能について説明しています。