タイム トラベル デバッグ - TTD.exe コマンド ライン ユーティリティ

Time travel debugging logo featuring a clock.

この記事では、TTD.exe コマンド ライン ユーティリティを使用してトレースを記録するタイミングと方法について説明します。

TTD.exe コマンド ライン ユーティリティを使用するタイミング

タイム トラベル デバッグ (TTD) を使用すると、アプリまたはプロセスのコード実行を記録し、トレース ファイルに保存できます。 このファイルを Windows デバッガーで再生して、コード実行に関する問題を見つけることができます。

多くのシナリオでは、TTD を使用してアプリまたはプロセスを記録する最も簡単な方法は、WinDbg UI から直接行うことです。 WinDbg UI を使用したタイム トラベル デバッグについては、「タイム トラベル デバッグ - 概要」を参照してください。

TTD コマンド ライン レコーダーしか必要ないシナリオもあり得ます (デバッガーをインストールしない状態での PC への記録、高度な記録シナリオ、テスト自動化など)。これらのシナリオでは、URL を介して TTD コマンド ライン レコーダーのみをインストールできます。

TTD の記録は記録されるプロセスに影響を与える

TTD の記録は侵入型技術です。 アプリケーションと選択した記録オプションによっては、記録中は実行中のアプリまたはプロセスの速度が 5 倍から 20 倍以上低下することに気付くでしょう。

作成されたトレース ファイルは徐々に大きくなり、大量のストレージ領域を必要とする可能性があります。 目的のプログラム アクティビティをキャプチャして最短時間トレースを行い、できるだけ早くトレースを終了します。

TTD がプロセスにアタッチされると、そのプロセスから削除することはできません。 TTD の記録が完了したら、アプリを閉じるか、プロセスを終了します。 システムクリティカルなプロセスの場合、OS の再起動が必要になります。

TTD の記録ではメモリの内容をキャプチャするので、ファイル パス、レジストリ、メモリ、ファイルの内容など、個人を特定できる情報やセキュリティ関連の情報が含まれる可能性があります。 正確な情報は、記録中のターゲット プロセス アクティビティによって異なります。

TTD.exe コマンド ライン ユーティリティをダウンロードしてインストールする方法 (推奨される方法)

https://aka.ms/ttd/download で TTD コマンド ライン ユーティリティをダウンロードします。

[インストール] を選択すると、TTD がダウンロードされ、インストールされます。 インストールが完了すると、TTD コマンドがシステム パスに追加され、コマンド プロンプトで使用できるようになります。

インストールで問題が発生した場合は、「アプリ インストーラー ファイルのインストールに関する問題のトラブルシューティング」を参照してください。

一部の PC では、Windows 10 用 Microsoft アプリ インストーラーをインストールすることが必要な場合があります。 これは、Windows の Microsoft Store アプリで利用できます。 Windows パッケージ マネージャーは、Windows 10 1809 以降のアプリ インストーラーでサポートされています。

TTD.exe コマンド ライン ユーティリティをダウンロードしてインストールする方法 (オフラインでの方法)

アプリ インストーラーを使用するインストール方法が推奨されますが、TTD コマンド ライン パッケージをダウンロードしてファイルを手動で抽出することもできます。 2 つの方法があるので、それぞれ解説します。

既にインストールされている TTD.exe コマンド ライン ユーティリティからファイルを抽出する

既に TTD コマンド ライン ユーティリティをインストールしている場合は、インストール場所からファイルを抽出できます。 インストール場所を見つけるには、PowerShell で以下のスクリプトを実行します。

(Get-AppxPackage | where Name -eq 'Microsoft.TimeTravelDebugging').InstallLocation

その場所から、すべてのバイナリ (*.dll、*.exe、*.sys) を新しい場所にコピーできます。 以下は、これを PowerShell で行う 1 つの方法です。

robocopy.exe (Get-AppxPackage | where Name -eq 'Microsoft.TimeTravelDebugging').InstallLocation c:\myttd *.exe *.dll *.sys /E /XD AppxMetadata

"c:\myttd" は、任意の移動先に置き換えます。 結果は以下のようになります (x64 マシンでの結果)。

ls -Recurse c:\myttd

    Directory: C:\myttd

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----           11/9/2023  2:43 PM                x86
-a---           11/9/2023  2:43 PM          79240 ProcLaunchMon.sys
-a---           11/9/2023  2:43 PM         112568 TTD.exe
-a---           11/9/2023  2:43 PM         309176 TTDInject.exe
-a---           11/9/2023  2:43 PM          55328 TTDLoader.dll
-a---           11/9/2023  2:43 PM         821176 TTDRecord.dll
-a---           11/9/2023  2:43 PM        1222584 TTDRecordCPU.dll
-a---           11/9/2023  2:43 PM          63416 TTDRecordUI.dll

    Directory: C:\myttd\x86

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---           11/9/2023  2:43 PM         247728 TTDInject.exe
-a---           11/9/2023  2:43 PM          42928 TTDLoader.dll
-a---           11/9/2023  2:43 PM        1128480 TTDRecordCPU.dll

x86 バイナリは、サブディレクトリ内にあります。 32 ビット プロセスを記録する必要がなければ、このフォルダーは削除できます (そもそもコピーされないようにするために robocopy コマンドに /xd x86 を追加することもできます)。 ARM64 バージョンには、サブディレクトリはありません。

TTDRecordUI.dllは、記録の制御に UI を使用する場合のみ必要です。 UI が不要であれば、このファイルは削除できます。

TTD.exe コマンド ライン ユーティリティ パッケージをダウンロードしてファイルを手動で抽出する

TTD コマンド ライン ユーティリティをインストールしない場合は、パッケージをダウンロードしてファイルを手動で抽出できます。 以下の PowerShell スクリプトで、次のことを行います。

  • https://aka.ms/ttd/download から現行バージョンの TTD の URL を取得する。
  • MSIX バンドルをダウンロードする。
  • 要求されたアーキテクチャの MSIX を MSIX バンドルから抽出する。
  • TTD バイナリを MSIX から抽出する。
param(
    $OutDir = ".",
    [ValidateSet("x64", "x86", "arm64")]
    $Arch = "x64"
)

# Ensure the output directory exists
if (!(Test-Path $OutDir)) {
    $null = mkdir $OutDir
}

# Ensure the temp directory exists
$TempDir = Join-Path $OutDir "TempTtd"
if (!(Test-Path $TempDir)) {
    $null = mkdir $TempDir
}

# Determine if the destination already contains binaries
$extensions = @('.dll', '.exe', '.sys')
$existingBinaries = (Get-ChildItem -recurse $OutDir | Where-Object Extension -In $extensions).Count -gt 0

# Download the appinstaller to find the current uri for the msixbundle
Invoke-WebRequest https://aka.ms/ttd/download -OutFile $TempDir\ttd.appinstaller

# Download the msixbundle
$msixBundleUri = ([xml](Get-Content $TempDir\ttd.appinstaller)).AppInstaller.MainBundle.Uri

if ($PSVersionTable.PSVersion.Major -lt 6) {
    # This is a workaround to get better performance on older versions of PowerShell
    $ProgressPreference = 'SilentlyContinue'
}

# Download the msixbundle (but name as zip for older versions of Expand-Archive)
Invoke-WebRequest $msixBundleUri -OutFile $TempDir\ttd.zip

# Extract the 3 msix files (plus other files)
Expand-Archive -DestinationPath $TempDir\UnzippedBundle $TempDir\ttd.zip -Force

# Expand the build you want - also renaming the msix to zip for Windows PowerShell
$fileName = switch ($Arch) {
    "x64"   { "TTD-x64"   }
    "x86"   { "TTD-x86"   }
    "arm64" { "TTD-ARM64" }
}

# Rename msix (for older versions of Expand-Archive) and extract the debugger
Rename-Item "$TempDir\UnzippedBundle\$fileName.msix" "$fileName.zip"
Expand-Archive -DestinationPath "$OutDir" "$TempDir\UnzippedBundle\$fileName.zip"

# Delete the temp directory
Remove-Item $TempDir -Recurse -Force

# Remove unnecessary files, if it is safe to do so
if (-not $existingBinaries) {
    Get-ChildItem -Recurse -File $OutDir |
        Where-Object Extension -NotIn $extensions |
        Remove-Item -Force

    Remove-Item -Recurse -Force (Join-Path $OutDir "AppxMetadata")
} else {
    Write-Host "Detected pre-existing binaries in '$OutDir' so did not remove any files from TTD package."
}

上記のスクリプトを Get-Ttd.ps1 として保存したと仮定すると、以下のスクリプトを実行すれば x64 バイナリを c:\myttd ディレクトリにダウンロードできます。

md c:\myttd
cd c:\myttd
.\Get-Ttd.ps1

または、出力先のディレクトリとアーキテクチャを指定することもできます。

.\Get-Ttd.ps1 -OutDir c:\myttd-arm64 -Arch arm64

"c:\myttd" または "c:\myttd-arm64" を、任意の出力先に置き換えます。

TTD.exe コマンド ライン ユーティリティを使用してトレースを記録する方法

トレースを記録するには 3 つの方法があります。

  • プロセスを起動する
  • プロセスへのアタッチ
  • プロセスを監視する

プロセスが記録されたら、デバッグする問題をトリガーする必要があります。 問題のあるファイルを開くか、アプリ内の特定のボタンをクリックして、関心のあるイベントを発生させます。 記録されているアプリケーションが自然に終了するか、クラッシュで終了すると、トレース ファイルの最終処理が行われます。

ヒント

TTD トレースを記録するには管理者権限が必要です。 通常、これを行うには、管理者コマンド プロンプトから ttd.exe を実行します。

WinDbg を使用してタイム トラベル トレースを記録する方法の詳細については、「タイム トラベル デバッグ - トレースの記録」を参照してください。

プロセスを起動する

-launch <Program> [<arguments>]

プログラムを起動してトレースします (既定のモード)。

これは、プログラムに引数を渡すことができる唯一のモードです。 プログラムは、(管理者として) TTD.exe と同じ権限で起動します。 通常の権限セットでプログラムを記録するには、-attach または -monitor を使用します。

-launch の指定は省略可能ですが、わかりやすくするために使用できます。

- または / で始まらない最初の認識されない引数は、起動する実行可能ファイルのパスと見なされ、後続の引数はそのプログラムの引数と見なされます。

たとえば、メモ帳を起動して記録するには、TTD.exe notepad.exe を使用します。 メモ帳を閉じると、トレースは停止します。

使用例については、「シナリオの使用例 - プロセスの記録」を参照してください。

プロセスへのアタッチ

-attach <PID>

プロセス ID で指定された実行中のプロセスにアタッチします。 TaskManager または TaskList ユーティリティを使用して、プロセス番号を確認します。 詳細については、「プロセス ID の検索」を参照してください。

たとえば、ID が 21440 のプロセスを起動して記録し、トレースを MyTraceFile.run に保存するには、TTD.exe -attach 21440 -out C:\traces\MyTraceFile.run を使用します。

TTD.exe を実行する前に、ディレクトリが存在することを確認します (この例では C:\traces)。

使用例については、「シナリオ - 実行中のプロセスを見つけてアタッチする」を参照してください。

プロセスを監視する

-monitor <Program>

monitor オプションを使用すると、プログラムを起動するたびに監視およびトレースできます。 このオプションを使用するには、-out を使用して出力場所への完全なパスを指定する必要があります。

監視を停止するには、Ctrl + C キーを押します。

他の方法と比較した監視の主な利点は次のとおりです。

  • 通常の方法でターゲット アプリを起動できます。起動するためのコマンド ラインを理解する必要はありません。
  • ターゲット アプリは通常の権限で実行されます。 ttd.exe から直接アプリを起動すると、管理者権限で起動されるので、プログラムの動作が変更される可能性があります。
  • 自動化に役立ちます (プログラムの起動を監視し、トレースを収集するスクリプトを使用します)。

-monitor オプションは、複数のプログラムを監視するために複数回指定できます。

使用例については、「シナリオの使用例 - プロセスの監視」を参照してください。

コマンドライン オプション

構文

TTD.exe [options] [mode] [program [<arguments>]]

-? | -help

コマンド ライン ヘルプを表示します。

モード

-launch <Program> [<arguments>]

プログラムを起動してトレースします (既定のモード)。

これは、プログラムに引数を渡すことができる唯一のモードです。 -launch オプションは、コマンドラインの最後の TTD オプションである必要があります。その後に、起動するプログラムとそのプログラムに必要な引数が続きます。 モードが指定されていない場合は、起動として同様に処理されます。 たとえば、TTD.exe -out C:\traces ping.exe msn.com は、起動として処理されます。

-attach <PID>

プロセス ID で指定された実行中のプロセスにアタッチします。 TaskManager または TaskList ユーティリティを使用して、プロセス ID を確認します。 詳細については、「プロセス ID の検索」を参照してください。

-monitor <Program>

プログラムまたはサービスを起動するたびに (再起動まで) トレースします。 このオプションを使用するには、-out を使用して出力場所への完全なパスを指定する必要があります。

基本的なコマンド ライン オプション

-out <path>

トレース ファイル名またはディレクトリを指定します。 ディレクトリの場合、そのディレクトリが既に存在している必要があります。 ファイル名の場合、そのファイル名は存在してはなりません。

-noUI

記録を手動で制御するための UI を無効にします。

このオプションが選択されていない場合は、記録がアクティブなときに小さな UI が表示されます。 [Tracing Off] (トレース オフ) は、トレースを停止し、アプリを続行します。[Exit App] (アプリの終了) は、トレースを停止し、アプリを閉じます。

Screenshot of small two button TTD UI displaying tracing status and an Exit App button.

-accepteula

エンドユーザー使用許諾契約書 (EULA) に同意するには、このオプションを使用します。 EULA が確認され、同意を得たら、このオプションを自動化シナリオで使用できます。

TTD では、初めて実行されるときに EULA が表示されます。 「Y」または「N」と入力して、EULA に同意するかどうかを指定します。 同意が得られると、起動時に EULA は表示されなくなります。 EULA の同意が得られない場合、TTD は終了し、次回 TTD が実行されたときに、EULA が表示されます。

トレース制御

-stop <process name> | <PID> | all

プロセス名または PID を指定してトレースを停止します。"all" を指定することもできます。

-wait <timeout>

システム上のすべてのトレース セッションが終了するのを、指定した秒数まで待ちます。 無限に待機するには、-1 を指定します。

-tracingOff

トレース記録をオフにしてアプリケーションを起動します。 トレースをオフにした後、UI のチェックボックスを使用してオンに戻すことができます。

その他のコマンド ライン オプション

-children

ターゲットと、ターゲットによって作成されたすべてのプロセスを記録します。 各子プロセスは、独自のトレース ファイルに記録されます。

-cmdLineFilter "<string>"

コマンド ラインにその文字列が含まれていれば、ターゲットを記録します。 このオプションは、-monitor モードでのみ機能します。 これは、コマンド ライン引数で目的のプロセスを一意に識別する場合に役立ちます。 たとえば、-monitor notepad.exe -cmdLineFilter "specialfile.txt" は、コマンド ラインに specialfile.txt が表示されている場合にのみ、notepad.exe を記録します。

-cleanup

プロセス監視ドライバーをアンインストールします。

トレースの動作の設定

-timestampFilename

トレース ファイル名の最後の部分にタイムスタンプを追加します (例: ping_2023-06-17_103116.run)。

たとえば、ファイル名にタイムスタンプを含めて ping.exe を記録するには、次のコマンドを使用します。

ttd.exe  -out c:\traces -timestampFilename ping.exe msn.com

既定では、出力ディレクトリ内の未使用のファイルを見つけるために順次スキャンが実行されます。 ping.exe が記録されている場合、レコーダーは未使用のファイル名が見つかるまで、 ping01.run、ping02.run などを試行します。 ほとんどのシナリオでは、この命名方法で十分です。 ただし、同じプログラムを何度も記録する場合、既存のファイルが多数あると、既定のファイル名前付けアルゴリズムが非効率的になる可能性があります。

-ring

リング バッファーにトレースします。 ファイル サイズは、-maxFile で指定した上限を超えることはありません。 指定したサイズに収まる、記録の最後の部分のみが保存されます。

-maxFile <size>

トレース ファイルの最大サイズ (MB)。 フル トレース モードの場合、既定値は 1024 GB、最小値は 1 MB です。 リング バッファー モードの場合、既定値は 2048 MB、最小値は 1 MB、最大値は 32768 MB です。

32 ビット プロセスでのインメモリ リングの既定値は 256 MB です。

-maxConcurrentRecordings <count>

任意の時点で継続できる記録の最大数。 指定しない場合は、同時に実行できる記録の数に制限はありません。

-numVCpu <number>

予約され、トレース時に使用される仮想 CPU の数を指定します。 この値は、TTD によってゲスト プロセスのメモリで発生するメモリ オーバーヘッドの合計に影響します。 指定しない場合、プラットフォームごとの既定値は、x64/ARM64 の場合は 55、x86 の場合は 32 です。

メモリ不足の場合にのみ、メモリへの影響を抑えるためにこの設定を変更します。 numVCpu の値を小さい数値に変更すると、トレースのパフォーマンスに大きな影響を与える可能性があるため、メモリ使用量の問題を回避する目的でのみ行ってください。

TTD.exe が記録に失敗した場合や、.out ファイルが 0 秒のシミュレーションを示している場合は、-numVCpu を使用すると記録が成功する可能性があります。

-replayCpuSupport <support>

トレースの再生に使用される CPU に必要なサポートを指定します。 マシン間でのトレースの移植性を実現するために、既定の設定が推奨されますが、(ターゲット プログラムで使用される特定の命令に応じて) 他のオプションを使用して、小さいトレース ファイルを生成し、記録を高速化することもできます。

<support>

Value 説明
Default 既定の CPU サポート。必要なのは、再生 CPU で一般的に利用できる基本的なサポートだけです。
MostConservative 再生 CPU で特別なサポートは不要です。 ARM64 CPU 上の Intel トレースのように、まったく異なる CPU アーキテクチャ上で再生されるトレースに適しています。
MostAggressive 再生 CPU が、記録に使用される CPU と同等以上の能力であることを想定しています。
IntelAvxRequired 再生 CPU が AVX をサポートする Intel/AMD 64 ビット CPU であることを想定しています。
IntelAvx2Required 再生 CPU が AVX2 をサポートする Intel/AMD 64 ビット CPU であることを想定しています。

トレースのオーバーヘッドを軽減する

TTD の処理は非常に効率的です (完全な命令レベルのトレースが平均して 1 バイト未満の命令にエンコードされます) が、記録時には顕著なオーバーヘッドが生じます。 最新の CPU は 1 秒あたり数十億の命令を実行できるため、1 つが 1 バイトの命令であっても負荷がかかります。 多くの場合、プロセス全体を記録する必要はありません。

次のオプションを使用することでトレースのオーバーヘッドを軽減できます。

-module <module name>

指定したモジュール (たとえば comdlg32.dll) と、それが呼び出すコードのみが記録されます。 実行可能ファイル自体、または実行可能ファイルによって読み込まれる任意の DLL を指定できます。 このオプションは、複数のモジュールを記録するために複数回指定できます。

このオプションを使用すると、指定したモジュール内のコードが実行されるまで、ターゲット プロセスが最大速度で実行されます。 その後、TTD は指定したモジュールの実行が終了するまでプロセスを記録します。実行が終了した時点で記録はオフになり、ターゲットが再び最高速度で実行されます。 記録のオン/オフの切り替えには負荷がかかるため、TTD は、指定されたモジュールがプロセス内の他のモジュールを呼び出した場合は記録をオンのまま維持します。

-recordmode <Automatic | Manual>

通常は、TTD がターゲット プロセスに挿入されると、すぐに記録が開始されます (既定の "自動" モード)。 プログラムで TTD のインプロセス記録 API を使用して記録が行われるタイミングを制御している場合は、"手動" モードを使用すれば、プログラムが API を呼び出して記録が開始されるまで最高速度で実行できます。

これらのオプションを使用すると、記録のオーバーヘッドとトレース ファイルのサイズが大幅に減る可能性があります。 これらのオプションで記録されたトレースのデバッグに、プロセス全体のトレースのデバッグとの違いはありません。 トレース内で記録がオフになっている場所の次に来るトレース内の命令は、必ず記録が再開されてから最初に実行された命令になります。

-passThroughExit

ゲストプロセスの終了値を TTD.exe の終了値として渡します。 この値は、%ERRORLEVEL% 変数を介してバッチ ファイルで使用できます。 PowerShell やその他のコマンド ライン環境には、プロセス終了値を取得するためのメカニズムも用意されています。

-onInitCompleteEvent <eventName>

トレースの初期化が完了したときにイベントを通知できるようにします。

シナリオの使用例 - プロセスの記録

シナリオ - Windows アプリを起動して記録する

このシナリオでは、メモ帳を起動し、トレースを作成します。

  1. -launch オプションを使用して、メモ帳を起動し、記録します。
C:\TTD> TTD.exe -launch notepad.exe
Launching 'notepad.exe'
    Recording process (PID:9960) on trace file: C:\TTD\notepad01.run
notepad.exe(x64) (PID:9960): Process exited with exit code 0 after 12984ms
  Full trace dumped to C:\TTD\notepad01.run
  1. トレースがオンになっていることを示す小さなアプリケーション メニューが表示されます。

Screenshot of TTD UI displaying tracing status and an Exit App button.

  1. アプリケーションが閉じられると、トレース ファイルが生成されます。 この例では、notepad01.run です。

シナリオ - 渡されたパラメーターで Windows アプリを起動して記録する

このシナリオでは、ping が開始され、ping を実行するアドレスがパラメーターとして渡されます。

  1. この例では、既定のモードであるため、-launch オプションは省略されています。
C:\TTD> TTD.exe ping.exe msn.com
Launching 'ping.exe msn.com'
    Recording process (PID:24044) on trace file: C:\TTD\ping01.run

Pinging msn.com [204.79.197.219] with 32 bytes of data:
Reply from 204.79.197.219: bytes=32 time=22ms TTL=118
Reply from 204.79.197.219: bytes=32 time=21ms TTL=118
Reply from 204.79.197.219: bytes=32 time=25ms TTL=118
Reply from 204.79.197.219: bytes=32 time=21ms TTL=118

Ping statistics for 204.79.197.219:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 21ms, Maximum = 25ms, Average = 22ms
ping.exe(x64) (PID:24044): Process exited with exit code 0 after 3390ms
  Full trace dumped to C:\TTD\ping01.run
  1. アプリケーションが閉じられると、トレース ファイルが生成されます。 この例では、ping01.run です。

シナリオ - 実行中のプロセスを見つけてアタッチする

このシナリオでは、メモ帳を起動し、そのプロセス ID を見つけ、実行中のアプリケーションにアタッチしてトレースを作成します。

  1. ターゲット アプリ (この例ではメモ帳) を起動します。

  2. TaskList または他の方法を使用して、プロセス ID を見つけます。 詳細については、「プロセス ID の検索」を参照してください。

C:\TTD> TaskList
...
Notepad.exe                  21440 Console                    1     73,020 K
...
  1. -attach オプションでそのプロセス ID を使用して、それをアタッチして記録します。 必要に応じて、-out を使用してトレース ファイルのファイル名を指定します。
C:\TTD> TTD.exe -attach 21440 -out C:\TTD\MyTraceFile.run
Attaching to 21440
    Recording process (PID:21440) on trace file: C:\TTD\MyTraceFile.run
(x64) (PID:21440): Process exited with exit code 0 after 26672ms
  Full trace dumped to C:\TTD\MyTraceFile.run

シナリオ - 親プロセスとその子プロセスを記録する

このシナリオでは、親プロセスとその子プロセスが記録されます。 一部のアプリでは多くの子プロセスを使用する場合があるため、子を含むファミリ トレース ファイルが非常に大きくなる可能性があります。

  1. -children オプションと記録する親アプリの名前を指定します。

子プロセスとして ping.exe を起動する cmd.exe を記録する例を次に示します。

ttd.exe -out d:\traces -children cmd.exe /C ping.exe msn.com

Microsoft (R) TTD 1.01.11
Release: 1.11.0.0
Copyright (C) Microsoft Corporation. All rights reserved.

Launching 'cmd.exe /C ping.exe msn.com'
    Recording process (PID:48200) on trace file: d:\traces\cmd01.run
    Recording process (PID:53724) on trace file: d:\traces\PING01.run

Pinging msn.com [204.79.197.219] with 32 bytes of data:
Reply from 204.79.197.219: bytes=32 time=6ms TTL=117
Reply from 204.79.197.219: bytes=32 time=6ms TTL=117
Reply from 204.79.197.219: bytes=32 time=7ms TTL=117
Reply from 204.79.197.219: bytes=32 time=7ms TTL=117

Ping statistics for 204.79.197.219:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 6ms, Maximum = 7ms, Average = 6ms
(x64) (PID:53724): Process exited with exit code 0 after 3516ms
  Trace family nesting level is 1; Parent process ID is 48200
  Full trace dumped to d:\traces\PING01.run

...

  1. 複数のトレース ファイルが作成されます。親プロセスのトレース ファイルと、各子プロセスのトレース ファイルです。 WinDbg では一度に 1 つのトレース ファイルしか開くことができないため、同時にデバッグする場合は、トレースごとに WinDbg の個別のインスタンスを実行する必要があります。

シナリオの使用例 - プロセスの監視

シナリオ - プログラムの起動を監視し、記録を開始する

このシナリオでは、-monitor オプションを使用して、システムが再起動されるか、Ctrl + C キーで ttd.exe を終了するまで、notepad.exe の現在実行中のインスタンスと将来のインスタンスをすべて記録します。 監視には -out オプションが必要であり、出力フォルダーが既に存在している必要があります。

  1. notepad.exe の現在のインスタンスと将来のインスタンスを監視してトレースします。
C:\TTD> TTD.exe -out C:\TTD\ -monitor notepad.exe
Microsoft (R) TTD 1.01.11
Release: 1.11.121.0
Copyright (C) Microsoft Corporation. All rights reserved.


The Process Launch Monitor driver is not installed
Successfully installed the Process Launch Monitor driver
Recording process Notepad.exe(15904)        From parent process explorer.exe(8440)
    Recording process (PID:15904) on trace file: C:\TTD\notepad01.run
Recording process Notepad.exe(19920)        From parent process explorer.exe(8440)
    Recording process (PID:19920) on trace file: C:\TTD\notepad02.run
(x64) (PID:19920): Process exited with exit code 0 after 1281ms
  Full trace dumped to C:\TTD\notepad02.run

(x64) (PID:15904): Process exited with exit code 0 after 30719ms
  Full trace dumped to C:\TTD\notepad01.run

  1. この例では、トレースが開始された後に、notepad.exe の 2 つのインスタンスが読み込まれました。 目的のアクティビティをキャプチャした後、コマンド プロンプトで Ctrl + C キーを使用して記録を停止しました。

シナリオ - 2 つのプログラムの起動を監視する

このシナリオでは、-monitor オプションを使用して、2 つのアプリケーションを監視し、記録します。

  1. notepad.exe と ping.exe の現在のインスタンスと将来のインスタンスを監視してトレースします。
C:\TTD> TTD.exe -out C:\TTD\ -monitor notepad.exe -monitor ping.exe
Microsoft (R) TTD 1.01.11
Release: 1.11.121.0
Copyright (C) Microsoft Corporation. All rights reserved.


Successfully uninstalled the Process Launch Monitor driver
Successfully installed the Process Launch Monitor driver
Recording process Notepad.exe(17972)        From parent process explorer.exe(8440)
    Recording process (PID:17972) on trace file: C:\TTD\Notepad01.run
Tracking process svchost.exe(7824)        From parent process services.exe(1292)
Tracking process sppsvc.exe(10376)        From parent process services.exe(1292)
Tracking process ClipUp.exe(15108)        From parent process svchost.exe(7824)
Tracking process ClipUp.exe(21180)        From parent process ClipUp.exe(15108)
Tracking process consent.exe(24280)        From parent process svchost.exe(892)
Tracking process ctfmon.exe(24508)        From parent process svchost.exe(5064)
Tracking process wt.exe(10768)        From parent process explorer.exe(8440)
Tracking process WindowsTerminal.exe(23296)        From parent process wt.exe(10768)
Tracking process OpenConsole.exe(6816)        From parent process WindowsTerminal.exe(23296)
Tracking process powershell.exe(15956)        From parent process WindowsTerminal.exe(23296)
Tracking process git.exe(3656)        From parent process powershell.exe(15956)
Tracking process git.exe(1928)        From parent process git.exe(3656)
Tracking process git.exe(20312)        From parent process powershell.exe(15956)
Tracking process git.exe(5712)        From parent process git.exe(20312)
Tracking process csc.exe(16144)        From parent process powershell.exe(15956)
Tracking process cvtres.exe(19488)        From parent process csc.exe(16144)
Recording process PING.EXE(21468)        From parent process powershell.exe(15956)
    Recording process (PID:21468) on trace file: C:\TTD\PING01.run
(x64) (PID:21468): Process exited with exit code 1 after 234ms
  Full trace dumped to C:\TTD\PING01.run


Tracking process Teams.exe(10060)        From parent process Teams.exe(2404)
Tracking process cmd.exe(21796)        From parent process powershell.exe(15956)
Recording process PING.EXE(364)        From parent process cmd.exe(21796)
    Recording process (PID:364) on trace file: C:\TTD\PING02.run
(x64) (PID:364): Process exited with exit code 1 after 234ms
  Full trace dumped to C:\TTD\PING02.run
  1. この例では、トレースが開始された後に、notepad.exe と ping.exe が読み込まれました。 目的のアクティビティをキャプチャした後、コマンド プロンプトで Ctrl + C キーを使用して記録を停止しました。

シナリオ - 2 つ目のウィンドウで記録を停止する

このシナリオでは、目的のアクティビティをキャプチャし、-stop all を使用してすべての記録を停止します。 2 つ目のコマンド ウィンドウを使用して、-stop all オプションを実行します。

C:\TTD> TTD.exe -stop all
Microsoft (R) TTD 1.01.11
Release: 1.11.121.0
Copyright (C) Microsoft Corporation. All rights reserved.

Full trace written to 'C:\TTD\Notepad01.run'

シナリオ - 監視ドライバーをクリーンアップする

このシナリオでは、-cleanup オプションを使用して、すべての記録の完了後に、監視ドライバーをクリーンアップします。

C:\TTD> TTD.exe -cleanup
The monitor service is not installed
Successfully uninstalled the Process Launch Monitor driver

コマンド ラインのその他の例

次の表は、コマンド ラインのその他の使用例を示しています。 例示されているオプションの詳細については、「コマンド ライン オプション」を参照してください。

シナリオ コマンド 説明
プロセスにアタッチするが、記録はまだ開始しない Ttd.exe -tracingoff notepad.exe 記録をオフにしてメモ帳を起動します。 記録は、UI を使用していつでも開始できます。
コマンド ラインでフィルター処理する Ttd.exe -cmdlinefilter foo.txt -monitor notepad.exe notepad.exe の起動時に、コマンド ラインに foo.txt がある場合にのみ、notepad.exe を記録し、出力を現在のディレクトリに配置します。
記録をリングする Ttd.exe -ring -attach 1234 PID 1234 を、上限が 2 GB に設定されたトレース ファイルに記録し、出力を現在のディレクトリに配置します。 ファイルを最大サイズ以下に保つために、トレース ファイル内の古い内容は必要に応じて上書きされます。

最大サイズを変更するには、-maxfile を使用します。
トレース ファイルのサイズを制限する Ttd.exe -maxfile 4096 notepad.exe トレース ファイルが 4 GB に達するまで notepad.exe を記録し、出力を現在のディレクトリに配置します。
同時に実行される記録の数を制限する Ttd.exe -maxconcurrentrecordings 1 -out c:\my\dir -monitor notepad.exe 記録は CPU 負荷が高くなる場合があります。
ターゲット プロセスでのメモリ使用量を削減する Ttd.exe -numvcpu 8 -monitor w3wp.exe w3wp.exe などの一部のプロセスでは、使用できるメモリの量に対して小さなクォータを設定します。 ttd.exe が記録を開始できない場合は、-numvcpu を使用して、TTD が割り当てる仮想 CPU の数を減らします。 ttd.exe が他の方法で記録できない場合にのみ、このオプションを試してください。
トレースの移植性と記録速度/トレース ファイル サイズのいずれかを選択する Ttd.exe -replaycpusupport mostaggressive notepad.exe 既定では、TTD はさまざまなハードウェア間で移植可能なトレース ファイルを生成します。 "mostaggressive" を選択すると、TTD は、トレースを記録したマシンと同じ能力を備えた CPU でのみ再生可能なトレースを記録できます。 これにより、場合によっては記録速度とトレース ファイル サイズを大幅に改善できます。

自動化のコマンド ラインの例

次の表は、TTD.exe ユーティリティの使用の自動化に役立つコマンド ラインの使用例を示しています。

シナリオ コマンド 説明
UI を無効にする Ttd.exe -noui -accepteula notepad.exe UI を表示せずに、notepad.exe を記録し、出力を現在のディレクトリに配置します。
プログラムによってレコーダーが起動するのを待つ Ttd.exe -accepteula -oninitcompleteevent ttd_notepad notepad.exe Win32 名前付きイベント "ttd_notepad" を作成し、notepad.exe を起動します。 記録が初期化されると、TTD は "ttd_notepad" を通知します。 自動化では、記録する動作を続行する前にイベントを待機できます。
ターゲットの終了コードを保持する Ttd.exe -accepteula -passthroughexit ping.exe msn.com ping.exe を記録し、出力を現在のディレクトリに配置します。 ttd.exe の終了コードは、ping.exe の終了コードと同じになります。
記録が終了するまで待つ Ttd.exe -accepteula -wait 30 記録が停止したら、TTD がディスクへのトレース ファイルの書き込みを完了するまで最大 30 秒待ちます。 待機時間を指定しない場合は -wait -1 を使用します。

これらの例はすべて、-accepteula オプションを使用して、EULA 確認ダイアログによって自動化がブロックされないようにしています。

生成されたトレース ファイルの操作

トレースの操作と、タイム トラベル トレースを再生して、時間を進めたり遡ったりする方法については、「タイム トラベル デバッグ - トレースの再生」を参照してください。

トレース ファイルの操作に関するヒント

  • トレースを他のユーザーと共有する場合は、.run ファイルを共有するだけで済みます。 インデックス ファイル (.idx) は、.run ファイルと同じくらいのサイズになる可能性があり、トレース ファイルが WinDbg によって読み込まれるときに自動的に作成されます。
  • 他の人とコラボレーションする場合は、問題に関連するトレース位置を伝えます。 コラボレーターは、!tt x:y コマンド使用して、その正確なコード実行時点に移動できます。 問題が発生している可能性がある場所を追跡するために、バグの説明に時間位置の範囲を含めることができます。
  • TTD で問題を報告するときに、.run ファイルを指定する場合は、.out ファイルも指定します。 これにより、記録プロセスが正常に動作したことを確認できます。
  • トレース ファイル (.run) は適切に圧縮されます。

TTD.exe のトラブルシューティング

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

.out ファイルはトラブルシューティングに使用できます。 次の out ファイルの例は、終了コード 0 で終了する機能トレースを示しています。

Microsoft (R) TTDRecord 1.01.11
Release: 1.11.47.0
Copyright (C) Microsoft Corporation. All rights reserved.


Initializing Time Travel Debugging for Attach to 9916
Time: 05/08/2023 17:07:15
OS:10.0.25314 EDITION:x64

SessionID: 008F918C-B8A7-4C4E-B91B-34CFC953C501

   (TTD::ManageTTDTrace:2725)
Running 
   (TTD::StartGuestProcess:1512)
Group tracing GUID: B84DF180-DA54-46E5-9019-73690C689979

Running "C:\WINDOWS\SYSTEM32\TTDInject.exe" /duration 1 /InjectMode LoaderForCombinedRecording /ClientParams "37 C:\TTD\Notepad03.run 0 0 0 0 0 0 0 0 c06001 0" /RecordScenario 268435458 /attach 9916 -TraceFileHandle 4f8 -GuestEventHandle 380 -ClientEventHandle 384 -ActiveEventHandle 4f4 -MutexHandle 46c -CommunicationBufferHandle 3c0 -SharedSequenceMutexHandle 3b8 -SharedSequenceBufferHandle 330 /TelemetryFeatureSessionId "008F918C-B8A7-4C4E-B91B-34CFC953C501"
   (TTD::StartGuestProcess:1955)
Microsoft (R) TTDInject 1.01.11
Release: 1.11.27.0
Copyright (C) Microsoft Corporation. All rights reserved.

TTDLoader Params:
 LauncherDll = TTDLoader
 ClientDll   = TTDRecordCPU
 ClientEntry = InitializeNirvanaClient
 ClientParams= 37 C:\TTD\Notepad03.run 0 0 0 0 0 0 0 0 c06001 0
 Attach
WaitForMain is off
Allocated processors:55, running threads:2.
Loader TTDLoader.dll injected at 0x00007FFF423B0000 0xc000 -- .reload  TTDLoader.dll=0x00007FFF423B0000,0xc000

Injection by thread is complete.
RecordingEngine initialization successful.
RecordVcpu initialization successful.
Loader initialization successful.
Guest Process is x64 binary.
Tracing started at: Tue May  9 00:07:16 2023 (UTC) Mon May  8 17:07:16 2023 (Local)

Guest process exited with exit code 0
Simulation time of '' (x64): 18781ms.
Tracing completed at: Tue May  9 00:07:34 2023 (UTC) Mon May  8 17:07:34 2023 (Local)

.out ファイルの内容のほとんどは、記録エラーのトラブルシューティングのために、タイム トラベル デバッグ チームが内部的に使用します。 次の情報は、トレース ファイルを操作している他のユーザーに役立つ場合があります。

  • 一部のエラー メッセージは .out ファイルにのみ表示され、エラーの詳細を確認するために使用できます。
  • 記録が開始/停止された実時間の表示
  • 記録セッションの継続時間 (シミュレーション時間)
  • 記録が起動 (コマンド ラインを使用) 記録とアタッチ記録のどちらであるか
  • OS のバージョン

参照

Time Travel Debugging - 概要

タイム トラベル デバッグ - トレースの記録

Time Travel Debugging - トレースの再生