Condividi tramite


Debug di viaggi temporali - utilità della riga di comando TTD.exe

Logo di debug di viaggi in tempo con un orologio.

Questo articolo descrive quando e come usare l'utilità della riga di comando TTD.exe per registrare una traccia.

Quando usare l'utilità della riga di comando TTD.exe

Time Travel Debug (TTD) consente di registrare l'esecuzione del codice di un'app o di un processo e salvarlo in un file di traccia. Il file può essere riprodotto nel debugger di Windows per individuare un problema con l'esecuzione del codice.

Per molti scenari, il modo più semplice per usare TTD per registrare un'app o un processo è direttamente dall'interfaccia utente di WinDbg. Per informazioni sul debug dei viaggi in tempo usando l'interfaccia utente winDbg, vedere Debug di viaggi temporali - Panoramica.

È possibile che siano presenti scenari in cui è necessario solo il registratore della riga di comando TTD: registrazione in un PC senza installare il debugger, scenari di registrazione avanzati, automazione dei test e così via. In questi scenari è possibile installare solo la registrazione della riga di comando TTD tramite un URL.

La registrazione TTD influisce sul processo registrato

La registrazione TTD è una tecnologia invasiva. Si noterà ovunque da 5x-20x o più rallentamento dell'app in esecuzione o del processo durante la registrazione, a seconda dell'applicazione e delle opzioni di registrazione selezionate.

I file di traccia creati aumentano nel tempo e possono richiedere spazio di archiviazione significativo. Lavorare per tracciare il periodo di tempo più breve, acquisire l'attività del programma di interesse e quindi chiudere la traccia il prima possibile.

Dopo aver collegato TTD a un processo, non può essere rimosso da esso. Chiudere l'app o terminare il processo dopo il completamento della registrazione TTD. Per i processi critici del sistema, questo richiederà un riavvio del sistema operativo.

Le registrazioni TTD acquisisce il contenuto della memoria e possono contenere informazioni personali o correlate alla sicurezza, incluse ma non necessariamente limitate ai percorsi dei file, al Registro di sistema, alla memoria o al contenuto del file. Le informazioni esatte dipendono dall'attività del processo di destinazione durante la registrazione.

Come scaricare e installare l'utilità della riga di comando TTD.exe (metodo Preferred)

Scaricare l'utilità della riga di comando TTD qui - https://aka.ms/ttd/download

Selezionare Installa e TTD scarica e installa. Il comando TTD viene aggiunto al percorso di sistema ed è disponibile per l'uso al prompt dei comandi, al termine dell'installazione.

Se si verificano problemi di installazione, vedere Risolvere i problemi di installazione con il file del programma di installazione app.

In alcuni PC potrebbe essere necessario installare l'Programma di installazione app Microsoft per Windows 10. È disponibile nell'app di Microsoft Store in Windows. Gestione pacchetti Windows è supportato tramite Il programma di installazione app a partire da Windows 10 1809.

Come scaricare e installare l'utilità della riga di comando TTD.exe (metodo offline)

Anche se il metodo di installazione preferito consiste nell'usare il programma di installazione app, è anche possibile scaricare il pacchetto della riga di comando TTD ed estrarre manualmente i file. Ecco due modi per farlo.

Estrarre i file da un'utilità della riga di comando già installata TTD.exe

Se l'utilità della riga di comando TTD è già stata installata, è possibile estrarre i file dal percorso installato. In PowerShell si eseguirà questa operazione per trovare il percorso installato:

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

Da qui è possibile copiare tutti i file binari (*.dll, *.exe, *.sys) in una nuova posizione. Ecco un modo per eseguire questa operazione in PowerShell:

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

Sostituire "c:\myttd" con la destinazione desiderata. Il risultato avrà un aspetto simile al seguente (in un computer 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

Si noti che i file binari x86 si trovano in una sottodirectory. Se non è necessario registrare processi a 32 bit, questa cartella può essere eliminata (e è possibile aggiungere /xd x86 al comando robocopy per evitare di copiarlo al primo posto). La versione di ARM64 non include sottodirectory.

La TTDRecordUI.dll è necessaria solo se si vuole usare l'interfaccia utente per controllare la registrazione. Se non si vuole che l'interfaccia utente venga eliminata, è possibile eliminare questo file.

Scaricare il pacchetto dell'utilità della riga di comando TTD.exe ed estrarre manualmente i file

Se non si vuole installare l'utilità della riga di comando TTD, è possibile scaricare il pacchetto ed estrarre manualmente i file. Lo script di PowerShell seguente:

  • Ottenere l'URL per la versione corrente di TTD da https://aka.ms/ttd/download.
  • Scaricare il bundle MSIX.
  • Estrarre il bundle MSIX dell'architettura richiesta dal bundle MSIX.
  • Estrarre i file binari TTD da 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."
}

Supponendo di aver salvato lo script precedente come Get-Ttd.ps1, è possibile eseguirlo come questo per scaricare i file binari x64 nella directory c:\myttd:

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

Oppure è possibile specificare la directory di output e l'architettura:

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

Sostituire "c:\myttd" o "c:\myttd-arm64" con la destinazione desiderata.

Come registrare una traccia usando l'utilità della riga di comando TTD.exe

Esistono tre modi per registrare una traccia.

  • Avviare un processo
  • Connettersi a un processo
  • Monitorare un processo

Dopo aver registrato il processo, è necessario attivare il problema che si desidera eseguire il debug. È possibile aprire un file problematico o fare clic su un pulsante specifico nell'app per causare l'evento di interesse. Quando l'applicazione registrata termina, naturalmente o arresta in modo anomalo, il file di traccia verrà finalizzato.

Suggerimento

La registrazione delle tracce TTD richiede diritti amministrativi. In genere, questa operazione viene eseguita eseguendo ttd.exe da un prompt dei comandi di amministratore.

Per altre informazioni sulla registrazione di una traccia di viaggio temporale tramite WinDbg, vedere Debug di viaggi temporali - Registrare una traccia.

Avviare un processo

-launch <Program> [<arguments>]

Avviare e tracciare il programma (modalità predefinita).

Questa è l'unica modalità che consente di passare argomenti al programma. Il programma verrà avviato con gli stessi privilegi di TTD.exe (come amministratore). Usare -attach o -monitor registrare il programma con il normale set di privilegi.

L'inclusione -launch è facoltativa, ma può essere usata per chiarezza.

Il primo argomento non riconosciuto che non inizia con - o / si presuppone che sia un percorso eseguibile da avviare e tutti gli argomenti successivi verranno assunti come argomenti per tale programma.

Ad esempio, usare TTD.exe notepad.exe per avviare e registrare il blocco note. La traccia si arresterà quando si chiude il blocco note.

Ad esempio, vedere Esempi di utilizzo dello scenario: registrazione di un processo.

Connettersi a un processo

-attach <PID>

Collegarsi a un processo in esecuzione specificato dall'ID processo. Usare TaskManager o l'utilità TaskList per identificare i numeri di processo. Per altre informazioni, vedere Ricerca dell'ID processo.

Ad esempio, usare TTD.exe -attach 21440 -out C:\traces\MyTraceFile.run per avviare e registrare il processo con e ID 21440 e salvare la traccia in MyTraceFile.run.

Assicurarsi che la directory esista (C:\traces in questo esempio) prima di eseguire TTD.exe.

Ad esempio, vedere Scenario - Individuare e collegare un processo in esecuzione.

Monitorare un processo

-monitor <Program>

L'opzione di monitoraggio consente di monitorare e tracciare un programma ogni volta che vengono avviati. Per usare questa opzione, è necessario specificare un percorso completo per il percorso di output con -out.

Per arrestare il monitoraggio premere CTRL+C.

I principali vantaggi del monitoraggio rispetto agli altri metodi sono:

  • È possibile avviare l'app di destinazione in modo normale, non è necessario capire la riga di comando per avviarla.
  • L'app di destinazione verrà eseguita con i privilegi normali. Se si avvia l'app direttamente da ttd.exe verrà avviata con privilegi elevati e ciò potrebbe modificare il comportamento del programma.
  • È utile per l'automazione (usare uno script che monitora l'avvio di un programma e raccoglie una traccia).

L'opzione -monitor può essere specificata più di una volta per monitorare più programmi.

Ad esempio, vedere Esempi di utilizzo dello scenario - Processi di monitoraggio.

Opzioni della riga di comando

Sintassi

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

-? | -help

Visualizzare la Guida della riga di comando.

Modalità

-launch <Program> [<arguments>]

Avviare e tracciare il programma (modalità predefinita).

Questa è l'unica modalità che consente di passare argomenti al programma. L'opzione -launch deve essere l'ultima opzione TTD nella riga di comando, seguita dal programma da avviare e da qualsiasi argomento richiesto dal programma. Se non viene specificata alcuna modalità, verrà considerata anche avviata. Ad esempio TTD.exe -out C:\traces ping.exe msn.com , viene considerato come avvio.

-attach <PID>

Collegarsi a un processo in esecuzione specificato dall'ID processo. Usare l'utilità TaskManager o TaskList per identificare gli ID processo. Per altre informazioni, vedere Ricerca dell'ID processo.

-monitor <Program>

Programmi o servizi di traccia ogni volta che vengono avviati (fino al riavvio). Per usare questa opzione, è necessario specificare un percorso completo per il percorso di output con -out.

Opzioni della riga di comando di base

-out <path>

Specificare un nome file di traccia o una directory. Se una directory deve già esistere. Se un nome file non deve esistere.

-noUI

Disabilita l'interfaccia utente per il controllo manuale della registrazione.

Se questa opzione non è selezionata, viene visualizzata una piccola interfaccia utente quando la registrazione è attiva. "Tracing Off" arresta la traccia e l'app continua; "Exit App" chiude l'app che arresta anche la traccia.

Screenshot di un piccolo pulsante TTD interfaccia utente che visualizza lo stato di traccia e un pulsante Esci app.

-accepteula

Usare questa opzione per accettare il contratto di licenza utente EULA. Questa opzione può essere usata negli scenari di automazione, dopo che l'EULA è stata esaminata e accettata.

TTD visualizza l'EULA la prima volta che viene eseguita. Digitare Y o N per accettare l'EULA. Una volta accettato, L'ELA non verrà più visualizzato all'avvio. Se l'EULA non viene accettata l'uscita TTD e verrà visualizzato l'EULA, la prossima volta che viene eseguito il TTD.

Controllo traccia

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

È possibile specificare l'interruzione della traccia del nome del processo specificato, PID o "all".

-wait <timeout>

Attendere fino alla quantità di secondi specificati per tutte le sessioni di traccia nel sistema da terminare. Specificare -1 per attendere infinitamente.

-tracingOff

Avvia l'applicazione con la registrazione di traccia disattivata. È possibile usare la casella di controllo interfaccia utente per attivare la traccia dopo la disattivazione.

Opzioni aggiuntive della riga di comando

-children

Registrare la destinazione e tutti i processi creati dalla destinazione. Ogni processo figlio verrà registrato nel proprio file di traccia.

-cmdLineFilter "<string>"

Registrare la destinazione se la riga di comando contiene la stringa. Questa opzione funziona solo con -monitor la modalità. È utile per situazioni in cui l'argomento della riga di comando identifica in modo univoco il processo a cui si è interessati. Ad esempio, -monitor notepad.exe -cmdLineFilter "specialfile.txt" i record notepad.exe solo se specialfile.txt viene visualizzato nella riga di comando.

-cleanup

Disinstallare il driver di monitoraggio del processo.

Impostazioni del comportamento della traccia

-timestampFilename

Aggiunge un timestamp all'ultima parte del nome del file di traccia. Ad esempio, ping_2023-06-17_103116.run.

Ad esempio, per registrare ping.exe, con un timestamp incluso nel nome del file, usare questo comando.

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

Per impostazione predefinita, viene eseguita un'analisi sequenziale per trovare un file inutilizzato nella directory di output. Se ping.exe viene registrato il registratore proverà ping01.run, ping02.run e così via. finché non viene trovato un nome di file inutilizzato. Per la maggior parte degli scenari, questo metodo di denominazione è sufficiente. Tuttavia, se si vuole registrare lo stesso programma molte volte, l'algoritmo di denominazione dei file predefinito può diventare inefficiente, quando esiste un numero elevato di file esistenti.

-ring

Traccia in un buffer anello. Le dimensioni del file non aumentano oltre i limiti specificati da -maxFile. Verrà salvata solo l'ultima parte della registrazione che rientra nella dimensione specificata.

-maxFile <size>

Dimensioni massime del file di traccia in MB. Quando in modalità di traccia completa il valore predefinito è 1024 GB e il valore minimo è 1 MB. Quando in modalità buffer anello il valore predefinito è 2048 MB, il valore minimo è 1 MB e il valore massimo è 32768 MB.

Il valore predefinito per l'anello in memoria nei processi a 32 bit è 256 MB.

-maxConcurrentRecordings <count>

Numero massimo di registrazioni che possono essere in corso in qualsiasi momento. Se non specificato, un numero illimitato di registrazioni può verificarsi contemporaneamente.

-numVCpu <number>

Specifica un numero di CPU virtuali da riservare e usare durante la traccia. Questo valore influisce sul sovraccarico di memoria totale inserito nella memoria del processo guest da TTD. Se non specificato, il valore predefinito per piattaforma è: 55 per x64/ARM64 e 32 per x86.

Modificare questa impostazione per limitare l'impatto sulla memoria solo se si sta esaurendo la memoria. La modifica del valore numVCpu a un numero inferiore può influire gravemente sulle prestazioni della traccia e deve essere eseguita solo per risolvere i problemi di utilizzo della memoria.

Se TTD.exe non riesce a registrare o il file con estensione out indica una simulazione di 0 secondi, l'uso -numVCpu può abilitare la registrazione con esito positivo.

-replayCpuSupport <support>

Specifica il supporto previsto dalle CPU che verranno usate per riprodurre la traccia. L'impostazione predefinita è consigliata per la portabilità delle tracce tra computer, ma altre opzioni possono essere usate per produrre file di tracce di piccole dimensioni e registrare più velocemente (a seconda delle istruzioni specifiche usate dal programma di destinazione).

<support> Valori

Valore Descrizione
Default Il supporto predefinito della CPU richiede solo il supporto comunemente disponibile nella CPU di riproduzione.
MostConservative Non è necessario alcun supporto speciale nella CPU di riproduzione. Adeguato per le tracce che verranno riprodotte su un'architettura CPU completamente diversa, come una traccia Intel sulla CPU ARM64.
MostAggressive Si supponga che la CPU di riproduzione sia simile e di capacità uguale o maggiore rispetto alla CPU usata per registrare.
IntelAvxRequired Si supponga che la CPU di riproduzione sarà Intel/AMD a 64 bit che supporta AVX.
IntelAvx2Required Si supponga che la CPU di riproduzione sia cpu Intel/AMD a 64 bit che supporta AVX2.

Riduzione del sovraccarico della traccia

Anche se TTD è molto efficiente per ciò che fa (la traccia a livello di istruzione completa codificata in meno di un byte/istruzione in media), ha ancora un sovraccarico evidente durante la registrazione. Le CPU moderne possono eseguire miliardi di istruzioni al secondo, rendendo anche un byte/istruzione costoso. In molti casi la registrazione dell'intero processo non è necessaria.

Le opzioni seguenti possono essere usate per ridurre il sovraccarico della traccia:

-module <module name>

Registrare solo il modulo specificato (ad esempio comdlg32.dll) e il codice che chiama. Può trattarsi del file eseguibile stesso o di qualsiasi DLL caricata dal file eseguibile. Questa opzione può essere specificata più di una volta per registrare più moduli.

Quando questa opzione viene usata, il processo di destinazione viene eseguito a velocità completa finché non viene eseguito il codice nei moduli specificati. TTD registra quindi il processo fino a quando l'esecuzione lascia i moduli specificati, in corrispondenza del quale la registrazione viene disattivata e la destinazione restituisce la velocità completa. Poiché l'attivazione/disattivazione della registrazione è costosa, TTD lascerà la registrazione quando un modulo specificato chiama altri moduli nel processo.

-recordmode <Automatic | Manual>

Normalmente la registrazione viene avviata non appena TTD si inserisce nel processo di destinazione ("Modalità automatica", l'impostazione predefinita). Se il programma usa l'API di registrazione in-process di TTD per controllare quando si verifica la registrazione, è possibile usare la modalità "Manuale" per eseguire a velocità completa fino a quando il programma chiama l'API per avviare la registrazione.

L'uso di queste opzioni può comportare una riduzione significativa del sovraccarico della registrazione e delle dimensioni del file di traccia. Il debug di una traccia registrata con queste opzioni non è diversa da una traccia dell'intero processo. Ogni volta che si raggiunge una posizione nella traccia in cui la registrazione viene disattivata, l'istruzione successiva nella traccia è la prima istruzione eseguita durante la ripresa della registrazione.

-passThroughExit

Passare il valore di uscita del processo guest come valore di uscita di TTD.exe. Questo valore è disponibile per i file batch tramite la %ERRORLEVEL% variabile. Powershell e altri ambienti della riga di comando offrono meccanismi per ottenere anche il valore di uscita del processo.

-onInitCompleteEvent <eventName>

Consente di segnalare un evento al termine dell'inizializzazione della traccia.

Esempi di utilizzo dello scenario - Registrazione di un processo

Scenario - Avviare e registrare un'app Di Windows

In questo scenario viene avviato il Blocco note e viene creata una traccia.

  1. Usare l'opzione per avviare il -launch Blocco note e registrarla.
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. Viene visualizzato un piccolo menu dell'applicazione che mostra che la traccia è attivata.

Screenshot dell'interfaccia utente TTD che mostra lo stato della traccia e un pulsante Esci dall'app.

  1. Quando l'applicazione viene chiusa, viene generato un file di traccia. In questo esempio notepad01.run.

Scenario - Avviare e registrare un'app di Windows con un parametro passato

In questo scenario viene avviato il ping e l'indirizzo per il ping viene passato come parametro.

  1. In questo esempio l'opzione -launch viene omessa così come è la modalità predefinita.
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. Quando l'applicazione viene chiusa, viene generato un file di traccia. In questo esempio ping01.run.

Scenario - Individuare e collegarsi a un processo in esecuzione

In questo blocco note dello scenario viene avviato, il relativo ID processo si trova e viene creata una traccia collegando all'applicazione in esecuzione

  1. Avviare l'app di destinazione, in questo Blocco note di esempio.

  2. Usare TaskList o altri metodi descritti in per individuare l'ID del processo. Per altre informazioni, vedere Ricerca dell'ID del processo.

C:\TTD> TaskList
...
Notepad.exe                  21440 Console                    1     73,020 K
...
  1. Usando tale ID processo, usare l'opzione -attach per allegarla e registrarla. Facoltativamente, specificare un nome file per il file di traccia usando -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

Scenario - Registrazione di un padre e dei relativi processi figlio

In questo scenario verrà registrato un elemento padre e i relativi processi figlio. Poiché alcune app possono usare molti processi figlio, il file di traccia della famiglia che contiene gli elementi figlio può diventare piuttosto grande.

  1. Specificare l'opzione -children e il nome dell'app padre da registrare.

Questo è un esempio di registrazione cmd.exe l'avvio ping.exe come processo figlio.

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. Vengono creati più file di traccia: uno per il processo padre e un file di traccia per ogni processo figlio. WinDbg apre un solo file di traccia alla volta, quindi dovrai eseguire istanze separate di WinDbg per ogni traccia, se vuoi eseguirne il debug contemporaneamente.

Esempi di utilizzo dello scenario - Processi di monitoraggio

Scenario : monitoraggio per l'avvio del programma e l'avvio della registrazione

In questo scenario l'opzione -monitor viene usata per registrare tutte le istanze attualmente in esecuzione e le istanze future di notepad.exe, fino a quando il sistema non viene riavviato o ttd.exe viene chiuso tramite CTRL+C. L'opzione -out è necessaria per il monitoraggio e la cartella di output deve esistere già.

  1. Monitorare e tracciare l'oggetto corrente, nonché eventuali istanze future di 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. In questo esempio sono state caricate due istanze di notepad.exe dopo l'avvio della traccia. Dopo l'acquisizione dell'attività di interesse, CTRL-C, è stata usata al prompt dei comandi per arrestare la registrazione.

Scenario - Monitoraggio di due programmi per l'avvio del programma

In questo scenario viene usata l'opzione -monitor per monitorare e registrare due applicazioni.

  1. Monitorare e tracciare le istanze correnti, nonché eventuali istanze future di notepad.exe e 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. In questo esempio notepad.exe e quindi ping.exe sono stati caricati dopo l'avvio della traccia. Dopo l'acquisizione dell'attività di interesse, CTRL-C, è stata usata al prompt dei comandi per arrestare la registrazione.

Scenario - Arresto della registrazione in una seconda finestra

In questo scenario l'attività di interesse è stata acquisita e tutte le registrazioni vengono arrestate usando -stop all. Per eseguire l'opzione -stop all viene usata una seconda finestra di comando.

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'

Scenario - Pulizia del driver di monitoraggio

In questo scenario l'opzione -cleanup viene usata per pulire il driver di monitoraggio al termine di tutte le registrazioni.

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

Altri esempi di riga di comando

Questa tabella evidenzia alcuni esempi aggiuntivi di utilizzo della riga di comando. Per altre informazioni sulle opzioni illustrate, vedere le opzioni della riga di comando .

Scenario Comando Descrizione
Collegarsi al processo ma non avviare ancora la registrazione Ttd.exe -tracingoff notepad.exe Avvia il Blocco note con la registrazione disattivata. La registrazione può essere avviata in qualsiasi momento tramite l'interfaccia utente.
Filtrare in base alla riga di comando Ttd.exe -cmdlinefilter foo.txt -monitor notepad.exe Registrare notepad.exe ma solo se foo.txt si trova nella riga di comando all'avvio, inserendo l'output nella directory corrente.
Registrazione circolare Ttd.exe -ring -attach 1234 Registra PID 1234 in un file di traccia limitato a 2 GB, inserendo l'output nella directory corrente. Il contenuto precedente nel file di traccia viene sovrascritto in base alle esigenze per mantenere il file con le dimensioni massime.

Usare -maxfile per modificare le dimensioni massime.
Limitare le dimensioni del file di traccia Ttd.exe -maxfile 4096 notepad.exe Registrare notepad.exe fino a quando il file di traccia non raggiunge i 4 GB, inserendo l'output nella directory corrente.
Limitare il numero di registrazioni che si verificano contemporaneamente Ttd.exe -maxconcurrentrecordings 1 -out c:\my\dir -monitor notepad.exe La registrazione richiede un utilizzo elevato della CPU e in alcuni casi.
Ridurre l'utilizzo della memoria nel processo di destinazione Ttd.exe -numvcpu 8 -monitor w3wp.exe Alcuni processi, ad esempio w3wp.exe, impostano una quota ridotta sulla quantità di memoria che può usare. Se ttd.exe non riesce a avviare la registrazione, usare -numvcpu per ridurre il numero di CPU virtuali allocate. Provare questa opzione solo se ttd.exe non è in grado di registrare tramite altri mezzi.
Scegliere tra la portabilità della traccia e la velocità di registrazione/le dimensioni dei file di traccia Ttd.exe -replaycpusupport mostaggressive notepad.exe Per impostazione predefinita, TTD produce file di traccia portabili in un'ampia gamma di hardware. La scelta di "mostaggressive" indica a TTD che è possibile registrare una traccia che può essere riprodotta solo sulle CPU con le stesse funzionalità del computer che ha registrato la traccia. In alcuni casi questo può migliorare notevolmente la velocità di registrazione e le dimensioni del file di traccia.

Esempi di riga di comando di Automazione

Questa tabella evidenzia alcuni esempi di utilizzo aggiuntivo della riga di comando che possono essere utili per l'uso automatizzato dell'utilità TTD.exe.

Scenario Comando Descrizione
Disabilitare l'interfaccia utente Ttd.exe -noui -accepteula notepad.exe Registrare notepad.exe, inserendo l'output nella directory corrente, senza visualizzare l'interfaccia utente.
Attendere l'avvio del registratore a livello di codice Ttd.exe -accepteula -oninitcompleteevent ttd_notepad notepad.exe Creare un evento denominato Win32 'ttd_notepad' e avviare notepad.exe. TTD segnalerà "ttd_notepad" quando la registrazione viene inizializzata. L'automazione può attendere l'evento prima di procedere con il comportamento da registrare.
Mantenere il codice di uscita della destinazione Ttd.exe -accepteula -passthroughexit ping.exe msn.com Registra ping.exe, inserendo l'output nella directory corrente. il codice di uscita di Ttd.exe sarà uguale al codice di uscita di ping.exe.
Attendere la fine della registrazione Ttd.exe -accepteula -wait 30 Dopo l'arresto della registrazione, attendere fino a 30 secondi prima che TTD completi la scrittura del file di traccia su disco. Usare -wait -1 per attendere per un periodo illimitato.

Tutti questi esempi usano l'opzione -accepteula per assicurarsi che l'automazione non sia bloccata dalla finestra di dialogo di conferma del contratto di licenza.

Utilizzo del file di traccia generato

Per informazioni sull'uso di una traccia e istruzioni su come riprodurre le tracce di spostamento temporale e spostarsi avanti e indietro nel tempo, vedere Debug del viaggio temporale - Riprodurre una traccia.

Suggerimenti sull'uso dei file di traccia

  • Quando si condividono tracce con altri utenti, è necessario condividere solo il file con estensione run. Il file di indice (con estensione idx) può essere grande quanto il file con estensione run e viene creato automaticamente quando il file di traccia viene caricato da WinDbg.
  • Quando si collabora con altri utenti, passare le posizioni di traccia rilevanti correlate al problema a portata di mano. Il collaboratore può usare il !tt x:y comando per passare a quel punto esatto nel tempo nell'esecuzione del codice. Gli intervalli di posizioni temporali possono essere inclusi nelle descrizioni dei bug per tenere traccia del possibile problema.
  • Quando si segnala un problema con TTD, se si specifica il file con estensione run, specificare anche il file out. Ciò consente di confermare che il processo di registrazione ha funzionato correttamente.
  • I file di traccia (con estensione run) comprimono bene.

Risoluzione dei problemi TTD.exe

Esistono alcuni casi in cui possono verificarsi errori del file di traccia. Per altre informazioni, vedere Debug del viaggio temporale - Risoluzione dei problemi.

Il file out può essere usato per la risoluzione dei problemi. Il file di esempio mostra una traccia funzionale, che termina con un codice di uscita pari a zero.

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)

La maggior parte del contenuto del file con estensione out viene usata internamente dal team di debug del viaggio temporale per risolvere gli errori di registrazione. Le informazioni seguenti possono essere utili ad altri utenti che utilizzano il file di traccia.

  • Alcuni messaggi di errore vengono visualizzati solo nel file con estensione out e possono essere usati per determinare le specifiche dell'errore.
  • Indicazione dell'ora di inizio/arresto della registrazione
  • Durata della sessione di registrazione (tempo di simulazione)
  • Indica se la registrazione è un avvio (con la riga di comando) o collega la registrazione
  • Versione del sistema operativo

Vedere anche

Debug di viaggi temporali - Panoramica

Debug del tempo di spostamento - Registrare una traccia

Debug del tempo di spostamento - Riprodurre una traccia