Debug del tempo di spostamento - utilità della riga di comando TTD.exe
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 possono contenere informazioni personali o correlate alla sicurezza
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.
-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.
Impostazioni correlate agli eventi
-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.
- 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
- Viene visualizzato un piccolo menu dell'applicazione che mostra che la traccia è attiva.
- 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.
- 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
- 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
Avviare l'app di destinazione, in questo blocco note di esempio.
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
...
- 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.
- 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
...
- 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à.
- 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
- 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.
- 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
- 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