Time Travel Debugging - 概要

Time travel debugging logo featuring a clock.

タイム トラベル デバッグとは

タイム トラベル デバッグは、プロセスの実行時にプロセスのトレースをキャプチャし、後で前後に再生できるツールです。 Time Travel Debugging (TTD) は、バグが見つかるまで問題を再現する必要なく、デバッガー セッションを "巻き戻す" ことで、問題をより簡単にデバッグするのに役立ちます。

TTD を使用すると、バグにつながる条件をより深く理解し、それを複数回再生して、問題を解決する最善の方法を学ぶことができます。

TTD にはクラッシュ ダンプ ファイルよりも優れた利点があり、最終的な障害の原因となった状態と実行パスを見落とすことがよくあります。

問題を自分で把握できない場合は、同僚とトレースを共有し、見ている内容を正確に確認できます。 これにより、ライブ デバッグよりもコラボレーションが容易になります。記録された命令は同じですが、アドレスの場所とコードの実行は異なる PC で異なります。 また、特定の時点を共有して、同僚がどこから始めればいかを把握するのに役立てることもできます。

TTD は効率的であり、トレース ファイル内のコード実行をキャプチャするため、できるだけ少ないオーバーヘッドを追加するように動作します。

TTD には、LINQ を使用してトレースにクエリを実行できるようにするためのデバッガー データ モデル オブジェクトのセットが含まれています。 たとえば、TTD オブジェクトを使用して、特定のコード モジュールが読み込まれたタイミングを特定したり、すべての例外を見つけたりすることができます。

Screenshot of WinDbg with Time Travel Debugging command and three timelines.

要件

Time Travel Debugging は WinDbg統合され、シームレスな記録と再生エクスペリエンスを提供します。

TTD を使用するには、デバッガーを管理者特権で実行する必要があります。 管理者特権を持つアカウントを使用して WinDbg をインストールし、デバッガーで記録するときにそのアカウントを使用します。 デバッガーを管理者特権で実行するには、スタート メニューの WinDbg アイコンを長押し (または右クリック) し、[その他>の実行を管理リストとして選択します。

記録を含む作成されたトレース ファイルには、ファイル パス、レジストリ、メモリ、またはファイルの内容など、個人を特定できる情報やセキュリティ関連の情報が含まれている場合があります。ただし、必ずしもこれらに限定されるわけではありません。 正確な情報は、記録中のターゲット プロセス アクティビティによって異なります。 記録ファイルを他のユーザーと共有する場合は、この点に注意してください。

コマンド ライン記録ユーティリティTTD.exe

WinDbg UI でトレースを記録するだけでなく、トレースを記録するために使用できるTTD.exeコマンド ライン ユーティリティがあります。

TTD コマンド ライン レコーダーのみが必要なシナリオ (デバッガーをインストールせずに PC に記録する、高度な記録シナリオ、テスト自動化など) がある場合があります。これらのシナリオでは、URL を介して TTD コマンド ライン レコーダーのみをインストールできます。 詳細については、「Time Travel Debugging - TTD.exe コマンド ライン ユーティリティ」を参照してください。

デバッグ ツールの比較

次の表は、使用可能なさまざまなデバッグ ソリューションの長所と短所をまとめたものです。

アプローチ 長所 デメリット
ライブ デバッグ 対話型エクスペリエンスは、実行のフローを確認し、ターゲットの状態を変更できます。使い慣れた設定で使い慣れたツールです。 ユーザー エクスペリエンスを中断し、問題を繰り返し再現する作業が必要になる場合があり、運用システム上のオプションではなく、セキュリティに影響を与える可能性があります。 再現コードでは、障害の時点から戻って原因を特定することは困難です。
ダンプ トリガーに基づいて、事前にコーディングする必要がなく、侵入性が低い。 連続するスナップショットまたはライブ ダンプは、単純な "時間の経過と伴う" ビューを提供します。 使用しない場合、オーバーヘッドは基本的にゼロになります。
テレメトリとログ 軽量で、多くの場合、ビジネス シナリオ/ユーザー アクションに関連付けられ、機械学習に優しい。 予期しないコード パス (テレメトリなし) で問題が発生します。 コードに静的にコンパイルされたデータの深さの不足。
タイム トラベル デバッグ (TTD) 複雑なバグに優れた、事前にコーディングしない、オフラインの反復可能なデバッグ、分析に優しい、すべてをキャプチャします。 記録時のオーバーヘッドが大きい。 必要なデータをさらに収集する場合があります。 データ ファイルが大きくなる可能性があります。

ビデオ トレーニング

TTD の詳細については、次のビデオを参照してください。

Defrag Tools 185 - Ivette と JamesP は TTD の基本を確認し、WinDbg のいくつかの機能をデモします

Defrag Tools 186 - Jordi と JCAB デモ WinDbg での TTD のより優れた機能

CppCon (YouTube) - Jordi、Ken、JamesM が CppCon 2017 で WinDbg で TTD を発表

トレース ファイルの基本

トレース ファイルのサイズ

トレース ファイルが大きくなる可能性があり、TTD のユーザーは、使用可能な十分な空き領域があることを確認する必要があります。 数分間でもプログラムを記録すると、トレース ファイルは数ギガバイトに急速に増加する可能性があります。 TTD では、複雑な実行時間の長いシナリオを可能にするトレース ファイルの最大サイズは設定されません。 問題をすばやく再作成すると、トレース ファイルのサイズは可能な限り小さくなります。

トレース ファイルとインデックス ファイル

トレース ファイル (.run) には、記録中のコードの実行が格納されます。

記録が停止すると、トレース情報へのアクセスを最適化するためにインデックス ファイル (.idx) が作成されます。 また、WinDbg でトレース ファイルが開かれると、インデックス ファイルも自動的に作成されます。

インデックス ファイルは、トレース ファイルの 2 倍の大きさ (通常は 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 つの例として、電子アプリケーション フレームワークがあります。 この場合、トレースが記録される可能性がありますが、記録されているプロセスのデッドロックまたはクラッシュも発生する可能性があります。

ユーザー モードのみ

TTD では現在、ユーザー モード操作のみがサポートされているため、カーネル モード プロセスのトレースは実行できません。

読み取り専用再生

時間をさかのぼって移動することはできますが、履歴を変更することはできません。 メモリ読み取りコマンドは使用できますが、メモリを変更または書き込むコマンドは使用できません。

システムで保護されたプロセス

保護されたプロセス ライト (PPL) プロセスなど、一部の Windows システムで保護されたプロセスが保護されているため、TTD はコード実行の記録を許可するために保護されたプロセスに自身を挿入できません。

記録のパフォーマンスへの影響

アプリケーションまたはプロセスを記録すると、PC のパフォーマンスに影響します。 実際のパフォーマンスオーバーヘッドは、記録中に実行されるコードの量と種類によって異なります。 一般的な記録シナリオでは、約 10 倍から 20 倍のパフォーマンスヒットが予想されます。 顕著な速度低下が発生しないことがありますが、リソースを集中的に使用する操作 (ファイルを開くダイアログなど) では、記録の影響を確認できます。

トレース ファイルのエラー

トレース ファイル エラーが発生する場合があります。 詳細については、「タイム トラベル デバッグ - トラブルシューティング」を参照してください

タイム トラベル デバッグの高度な機能

最も注目すべき TTD 高度な機能の一部を次に示します。

タイムライン

タイムラインは、実行中に発生するイベントを視覚的に表します。 これらのイベントには、ブレークポイント、メモリの読み取り/書き込み、関数の呼び出しと戻り値、例外の場所を指定できます。 タイムラインの詳細については、「WinDbg - タイムライン」を参照してください

デバッガー データ モデルのサポート

  • 組み込みのデータ モデルのサポート - TTD にはデータ モデルのサポートが含まれています。 LINQ クエリを使用してアプリケーションのエラーを分析することは、強力なツールになる可能性があります。 WinDbg のデータ モデル ウィンドウを使用すると、展開可能で拡張可能なバージョンの 'dx' と 'dx -g' を操作できます。これにより、NatVis、JavaScript、LINQ クエリを使用してテーブルを作成できます。

デバッガー データ モデルの一般的な情報については、「WinDbg - データ モデル」を参照してください。 TTD デバッガー オブジェクト モデルの操作の詳細については、「タイム トラベル デバッグ - タイム トラベル デバッグ オブジェクトの概要」を参照してください

スクリプトのサポート

  • スクリプトの自動化 - JavaScript と NatVis のスクリプトのサポートにより、問題の調査を自動化できます。 詳細については、「タイム トラベル デバッグ - JavaScript オートメーション」を参照してください

JavaScript と NatVis の操作に関する一般的な情報については、「WinDbg - スクリプト」を参照してください

コマンド ライン ユーティリティTTD.exe

トレースを記録するTTD.exeコマンド ライン ユーティリティを使用できます。 詳細については、「Time Travel Debugging - TTD.exe コマンド ライン ユーティリティ」を参照してください。

マネージド コード TTD のサポート

64 ビット モードで実行されている SOS デバッグ拡張機能 (sos.dll) を使用して、WinDbg の TTD を使用してマネージド コードをデバッグできます。 詳細については、「Windows デバッガーを使用したマネージド コードのデバッグ」を参照してください

TTD の概要

トレース ファイルの記録と再生、およびトレース ファイルの操作とトラブルシューティングについては、次のトピックを参照してください。

これらのトピックでは、タイム トラベル デバッグの追加の高度な機能について説明します。