Condividi tramite


Debug del tempo di spostamento - utilità della riga di comando TTD.exe

Logo di debug del tempo di viaggio 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

Il debug TTD (Time Travel Debugging) 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 relativo all'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 del tempo di spostamento con l'interfaccia utente di WinDbg, vedere Time Travel Debugging - Overview (Debug di viaggi temporali - Panoramica).

Potresti avere scenari in cui è necessario solo il registratore da 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 il registratore 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 o del processo in esecuzione 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.

Una volta collegato TTD a un processo, non può essere rimosso da esso. Chiudere l'app o terminare il processo al termine della registrazione TTD. Per i processi critici del sistema, sarà necessario riavviare il 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 di 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 scaricherà e installerà. 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 il 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 i file manualmente. Ecco due modi per farlo.

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

Se è già stata installata l'utilità della riga di comando TTD, è possibile estrarre i file dal percorso installato. In PowerShell eseguire 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 sarà 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 (ed è possibile aggiungere /xd x86 al comando robocopy per evitare di copiarla in primo luogo). La versione arm64 non include sottodirectory.

Il TTDRecordUI.dll è necessario solo se si vuole usare l'interfaccia utente per controllare la registrazione. Se non si vuole usare l'interfaccia utente, è 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 l'architettura richiesta MSIX 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 segue per scaricare i file binari x64 nella directory c:\myttd:

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

In alternativa, è 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 di cui si vuole eseguire il debug. È possibile aprire un file problematico o fare clic su un pulsante specifico nell'app per fare in modo che si verifichi l'evento di interesse. Quando l'applicazione registrata termina, naturalmente o arrestando 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 dell'amministratore.

Per altre informazioni sulla registrazione di una traccia di spostamento temporale con 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 per registrare il programma con il normale set di privilegi.

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

Il primo argomento non riconosciuto che non inizia con - o / sarà considerato un percorso eseguibile da avviare e tutti gli argomenti successivi verranno considerati gli argomenti per tale programma.

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

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

Connettersi a un processo

-attach <PID>

Connettersi 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 del processo.

Ad esempio, usare TTD.exe -attach 21440 -out C:\traces\MyTraceFile.run per avviare e registrare il processo con e l'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 a 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 interrompere 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 individuare la riga di comando per avviarla.
  • L'app di destinazione verrà eseguita con i privilegi normali. Se avvii l'app direttamente da ttd.exe verrà avviata con privilegi elevati e questo 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ù volte per monitorare più programmi.

Per un esempio di utilizzo, 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 ed eventuali argomenti richiesti dal programma. Se non viene specificata alcuna modalità, verrà considerata anche l'avvio. Ad esempio TTD.exe -out C:\traces ping.exe msn.com , viene considerato come un lancio.

-attach <PID>

Connettersi 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 del processo.

-monitor <Program>

Tracciare programmi o servizi 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 di file di traccia o una directory. Se una directory deve esistere già. Se un nome di 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; "Esci dall'app" chiude l'app che interrompe anche la traccia.

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

-accepteula

Usare questa opzione per accettare il contratto di licenza utente con contratto di licenza con contratto di licenza utente. Questa opzione può essere usata negli scenari di automazione, dopo che il contratto di licenza è stato esaminato e accettato.

TTD visualizza il contratto di licenza la prima volta che viene eseguito. Digitare Y o N per accettare il contratto di licenza. Una volta accettato, l'ELA non verrà più visualizzata all'avvio. Se il contratto di licenza non viene accettato TTD e il contratto di licenza verrà visualizzato, alla successiva esecuzione del TTD.

Controllo di traccia

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

È possibile specificare stop tracing del nome del processo specificato, PID o "all".

-wait <timeout>

Attendere fino alla quantità di secondi specificata per la fine di tutte le sessioni di traccia nel sistema. Specificare -1 per attendere infinitamente.

-tracingOff

Avvia l'applicazione con la registrazione della traccia disattivata. È possibile usare la casella di controllo dell'interfaccia utente per riattivare la traccia dopo che è stata disattivata.

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 le 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 di 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 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 desidera registrare lo stesso programma più volte, l'algoritmo di denominazione dei file predefinito può diventare inefficiente, quando è presente un numero elevato di file esistenti.

-ring

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

-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 circolare 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 utilizzare durante la traccia. Questo valore influisce sul sovraccarico di memoria totale posizionato sulla memoria del processo guest da TTD. Se non specificato, il valore predefinito per ogni piattaforma è: 55 per x64/ARM64 e 32 per x86.

Modificare questa impostazione per limitare l'impatto sulla memoria solo se si esaurisce la memoria. La modifica del valore numVCpu in 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 di può consentire la riuscita della registrazione.

-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 è possibile usare altre opzioni per produrre file di tracce di piccole dimensioni e registrare più velocemente (a seconda delle istruzioni specifiche usate dal programma di destinazione).

Valori <support>

valore Descrizione
Default Il supporto predefinito della CPU richiede solo il supporto di base disponibile nella CPU di riproduzione.
MostConservative Non richiede alcun supporto speciale nella CPU di riproduzione. Adeguata per le tracce che verranno riprodotte in un'architettura cpu completamente diversa, ad esempio 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 sarà 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 comunque un sovraccarico notevole durante la registrazione. Le CPU moderne possono eseguire miliardi di istruzioni al secondo, rendendo costoso anche un byte/istruzione. In molti casi la registrazione dell'intero processo non è necessaria.

Per ridurre l'overhead della traccia, è possibile usare le opzioni seguenti:

-module <module name>

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

Quando questa opzione viene usata, il processo di destinazione viene eseguito a velocità massima fino a quando non viene eseguito il codice nei moduli specificati. TTD registrerà quindi il processo fino a quando l'esecuzione non lascia i moduli specificati, in corrispondenza del quale la registrazione del punto viene disattivata e la destinazione torna a piena velocità. Poiché l'attivazione/disattivazione della registrazione è costosa, TTD lascerà attiva 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", 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 l'esecuzione a tutta velocità fino a quando il programma chiama l'API per avviare la registrazione.

L'uso di queste opzioni può comportare una riduzione significativa del sovraccarico di registrazione e delle dimensioni dei 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 viene disattivata la registrazione, l'istruzione successiva nella traccia è la prima istruzione eseguita quando viene ripresa la 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 -launch per avviare il 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 è attiva.

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 di ping viene passato come parametro.

  1. In questo esempio l'opzione -launch viene omessa perché è 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 collegare a un processo in esecuzione

In questo blocco note di scenario viene avviato il relativo ID processo e viene creata una traccia collegando l'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 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 elemento 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 di 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 viene usata l'opzione -monitor per registrare tutte le istanze attualmente in esecuzione, nonché 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 due istanze di notepad.exe sono state caricate 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 l'oggetto corrente, 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 è stata acquisita l'attività di interesse 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 viene usata l'opzione -cleanup per pulire il driver di monitoraggio dopo il completamento 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 di utilizzo aggiuntivo 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 blocco note con 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. I contenuti meno recenti nel file di traccia vengono sovrascritti in base alle esigenze per mantenere il file sotto 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 è a elevato utilizzo di 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/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 è ok 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 automatico dell'utilità TTD.exe.

Scenario Comando Descrizione
Disabilitare l'interfaccia utente Ttd.exe -noui -accepteula notepad.exe Registra 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" durante l'inizializzazione della registrazione. 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. Ttd.exe codice di uscita 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 l'attesa indefinita.

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 di viaggi temporali - 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 come 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 eventuali 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

In alcuni casi possono verificarsi errori di file di traccia. Per altre informazioni, vedere Debug di viaggi temporali - Risoluzione dei problemi.

Il file con estensione out può essere usato per la risoluzione dei problemi. Il file di esempio mostra una traccia funzionale, terminando 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 out viene usata internamente dal team di debug del tempo di viaggio per risolvere gli errori di registrazione. Le informazioni seguenti possono essere utili per altri utenti che utilizzano il file di traccia.

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

Vedi anche

Debug di viaggi temporali - Panoramica

Debug di viaggi temporali - Registrare una traccia

Debug del tempo di spostamento - Riprodurre una traccia