Débogage de voyage dans le temps - utilitaire de ligne de commande TTD.exe

Logo de débogage de voyage dans le temps avec une horloge.

Cet article explique quand et comment utiliser l’utilitaire de ligne de commande TTD.exe pour enregistrer une trace.

Quand utiliser l’utilitaire de ligne de commande TTD.exe

Le débogage TTD (Time Travel Debugging) vous permet d’enregistrer l’exécution du code d’une application ou d’un processus et de l’enregistrer dans un fichier de trace. Le fichier peut être lu dans le débogueur Windows pour localiser un problème avec l’exécution du code.

Pour de nombreux scénarios, le moyen le plus simple d’utiliser TTD pour enregistrer une application ou un processus est directement à partir de l’interface utilisateur WinDbg. Pour plus d’informations sur le débogage des voyages dans le temps à l’aide de l’interface utilisateur WinDbg, consultez Débogage des voyages dans le temps - Vue d’ensemble.

Vous pouvez avoir des scénarios où seul l’enregistreur de ligne de commande TTD est requis : enregistrement sur un PC sans installer le débogueur, scénarios d’enregistrement avancés, automatisation des tests, etc. Dans ces scénarios, vous pouvez installer uniquement l’enregistreur de ligne de commande TTD via une URL.

L’enregistrement TTD a un impact sur le processus enregistré

L’enregistrement TTD est une technologie invasive. Vous remarquerez entre 5 et 20x ou plus un ralentissement de l’application ou du processus en cours d’exécution lors de l’enregistrement, en fonction de l’application et des options d’enregistrement sélectionnées.

Les fichiers de trace créés augmentent au fil du temps et peuvent prendre beaucoup d’espace de stockage. Effectuez le suivi pendant la période la plus courte possible, en capturant l’activité de programme d’intérêt, puis en fermant la trace dès que possible.

Une fois que TTD est attaché à un processus, il ne peut pas être supprimé de celui-ci. Fermez l’application ou mettez fin au processus une fois l’enregistrement TTD terminé. Pour les processus critiques du système, cela nécessite un redémarrage du système d’exploitation.

Les enregistrements TTD capturent le contenu de la mémoire et peuvent contenir des informations d’identification personnelle ou liées à la sécurité, y compris, mais sans nécessairement s’y limiter, les chemins d’accès aux fichiers, le registre, la mémoire ou le contenu de fichier. Les informations exactes dépendent de l’activité du processus cible pendant son enregistrement.

Guide pratique pour télécharger et installer l’utilitaire de ligne de commande TTD.exe (méthode préférée)

Téléchargez l’utilitaire de ligne de commande TTD ici - https://aka.ms/ttd/download

Sélectionnez Installer et TTD télécharge et installe. La commande TTD est ajoutée au chemin d’accès système et peut être utilisée à l’invite de commandes, une fois l’installation terminée.

Si vous rencontrez des difficultés lors de l’installation, consultez Résoudre les problèmes d’installation avec le fichier programme d’installation de l’application.

Sur certains PC, vous devrez peut-être installer le Programme d'installation d'application Microsoft pour Windows 10. Il est disponible dans l’application Microsoft Store dans Windows. Gestionnaire de package Windows est pris en charge via le programme d’installation d’application à partir du Windows 10 1809.

Comment télécharger et installer l’utilitaire de ligne de commande TTD.exe (méthode hors connexion)

Bien que la méthode d’installation recommandée consiste à utiliser le programme d’installation d’application, vous pouvez également télécharger le package de ligne de commande TTD et extraire les fichiers manuellement. Voici deux façons de procéder.

Extraire les fichiers d’un utilitaire de ligne de commande TTD.exe déjà installé

Si vous avez déjà installé l’utilitaire de ligne de commande TTD, vous pouvez extraire les fichiers à partir de l’emplacement installé. Dans PowerShell, vous devez effectuer cette opération pour trouver l’emplacement installé :

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

À partir de là, vous pouvez copier tous les fichiers binaires (*.dll, *.exe, *.sys) vers un nouvel emplacement. Voici une façon de procéder dans PowerShell :

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

Remplacez « c :\myttd » par la destination de votre choix. Le résultat ressemble à ceci (sur un ordinateur 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

Notez que les fichiers binaires x86 se trouvent dans un sous-répertoire. Si vous n’avez pas besoin d’enregistrer les processus 32 bits, ce dossier peut être supprimé (et vous pouvez ajouter /xd x86 à la commande robocopy pour éviter de le copier en premier lieu). La version ARM64 n’a pas de sous-répertoires.

Le TTDRecordUI.dll n’est nécessaire que si vous souhaitez utiliser l’interface utilisateur pour contrôler l’enregistrement. Si vous ne voulez pas l’interface utilisateur, vous pouvez supprimer ce fichier.

Téléchargez le package de l’utilitaire de ligne de commande TTD.exe et extrayez les fichiers manuellement

Si vous ne souhaitez pas installer l’utilitaire de ligne de commande TTD, vous pouvez télécharger le package et extraire les fichiers manuellement. Le script PowerShell suivant :

  • Obtenez l’URL de la version actuelle de TTD à partir de https://aka.ms/ttd/download.
  • Téléchargez l’offre groupée MSIX.
  • Extrayez le MSIX de l’architecture demandée à partir du bundle MSIX.
  • Extrayez les fichiers binaires TTD de 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."
}

En supposant que vous avez enregistré le script ci-dessus en tant que Get-Ttd.ps1, vous pouvez l’exécuter comme suit pour télécharger les fichiers binaires x64 dans le répertoire c :\myttd :

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

Vous pouvez également spécifier le répertoire de sortie et l’architecture :

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

Remplacez « c :\myttd » ou « c :\myttd-arm64 » par la destination de votre choix.

Comment enregistrer une trace à l’aide de l’utilitaire de ligne de commande TTD.exe

Il existe trois façons d’enregistrer une trace.

  • Lancer un processus
  • Attacher à un processus
  • Surveiller un processus

Une fois le processus enregistré, vous devez déclencher le problème que vous souhaitez déboguer. Vous pouvez ouvrir un fichier problématique ou cliquer sur un bouton spécifique dans l’application pour provoquer l’événement d’intérêt. Lorsque l’application en cours d’enregistrement se termine, naturellement ou en plantant, le fichier de trace est finalisé.

Conseil

L’enregistrement des traces TTD nécessite des droits d’administration. En règle générale, cela s’effectue en exécutant ttd.exe à partir d’une invite de commandes administrateur.

Pour plus d’informations sur l’enregistrement d’une trace de voyage dans le temps à l’aide de WinDbg, consultez Débogage de voyage dans le temps - Enregistrer une trace.

Lancer un processus

-launch <Program> [<arguments>]

Lancez et tracez le programme (mode par défaut).

Il s’agit du seul mode qui vous permet de passer des arguments au programme. Le programme sera lancé avec les mêmes privilèges que TTD.exe (en tant qu’administrateur). Utilisez -attach ou -monitor pour enregistrer le programme avec son ensemble normal de privilèges.

L’inclusion -launch est facultative, mais peut être utilisée pour plus de clarté.

Le premier argument non reconnu qui ne commence pas par - ou / est supposé être un chemin d’accès exécutable à lancer, et tous les arguments suivants sont supposés être les arguments de ce programme.

Par exemple, utilisez TTD.exe notepad.exe pour lancer et enregistrer le Bloc-notes. La trace s’arrête lorsque vous fermez le Bloc-notes.

Pour obtenir des exemples d’utilisation, consultez Exemples d’utilisation de scénarios - enregistrement d’un processus.

Attacher à un processus

-attach <PID>

Attacher à un processus en cours d’exécution spécifié par l’ID de processus. Utilisez TaskManager ou l’utilitaire TaskList pour identifier les numéros de processus. Pour plus d’informations, consultez Recherche de l’ID de processus.

Par exemple, utilisez TTD.exe -attach 21440 -out C:\traces\MyTraceFile.run pour lancer et enregistrer le processus avec et l’ID 21440 et enregistrer la trace dans MyTraceFile.run.

Vérifiez que le répertoire existe (C:\traces dans cet exemple) avant d’exécuter TTD.exe.

Pour obtenir un exemple d’utilisation, consultez Scénario - Localiser et attacher à un processus en cours d’exécution.

Surveiller un processus

-monitor <Program>

L’option monitor permet de surveiller et de tracer un programme chaque fois qu’il est démarré. Pour utiliser cette option, vous devez spécifier un chemin d’accès complet à l’emplacement de sortie avec -out.

Pour arrêter la surveillance, appuyez sur Ctrl+C.

Les avantages main de la surveillance par rapport aux autres méthodes sont les suivants :

  • Vous pouvez lancer l’application cible normalement. Vous n’avez pas besoin de déterminer la ligne de commande pour la démarrer.
  • L’application cible s’exécutera avec ses privilèges normaux. Si vous lancez l’application directement à partir de ttd.exe elle sera lancée avec élévation de privilèges, ce qui peut modifier le comportement du programme.
  • Il est utile pour l’automatisation (utiliser un script qui surveille le lancement d’un programme et collecte une trace).

L’option -monitor peut être spécifiée plusieurs fois pour surveiller plusieurs programmes.

Pour obtenir des exemples d’utilisation, consultez Exemples d’utilisation de scénarios - Processus de supervision.

Options de ligne de commande

Syntax

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

-? | -help

Affichez l’aide de la ligne de commande.

Modes

-launch <Program> [<arguments>]

Lancez et suivez le programme (mode par défaut).

Il s’agit du seul mode qui vous permet de passer des arguments au programme. L’option -launch doit être la dernière option TTD de la ligne de commande, suivie du programme à lancer et des arguments requis par le programme. Si aucun mode n’est spécifié, il sera également traité comme un lancement. Par exemple TTD.exe -out C:\traces ping.exe msn.com , est traité comme un lancement.

-attach <PID>

Attacher à un processus en cours d’exécution spécifié par l’ID de processus. Utilisez l’utilitaire TaskManager ou TaskList pour identifier les ID de processus. Pour plus d’informations, consultez Recherche de l’ID de processus.

-monitor <Program>

Suivez les programmes ou services chaque fois qu’ils sont démarrés (jusqu’au redémarrage). Pour utiliser cette option, vous devez spécifier un chemin d’accès complet à l’emplacement de sortie avec -out.

Options de ligne de commande de base

-out <path>

Spécifiez un nom de fichier de trace ou un répertoire. S’il s’agit d’un répertoire, le répertoire doit déjà exister. S’il s’agit d’un nom de fichier, celui-ci ne doit pas exister.

-noUI

Désactive l’interface utilisateur pour le contrôle manuel de l’enregistrement.

Si cette option n’est pas sélectionnée, une petite interface utilisateur s’affiche lorsque l’enregistrement est actif. « Traçage désactivé » arrête le suivi et l’application continue ; « Quitter l’application » ferme l’application, ce qui arrête également le suivi.

Capture d’écran de l’interface utilisateur TTD à deux petits boutons affichant des status de suivi et un bouton Quitter l’application.

-accepteula

Utilisez cette option pour accepter le contrat de licence utilisateur du CLUF. Cette option peut être utilisée dans des scénarios d’automatisation, une fois que le CLUF a été examiné et accepté.

TTD affiche le CLUF la première fois qu’il est exécuté. Tapez Y ou N pour accepter le CLUF. Une fois acceptée, l’ELA ne s’affiche plus au démarrage. Si le CLUF n’est pas accepté quitte le TTD et que le CLUF s’affiche, la prochaine fois que TTD est exécuté.

Contrôle de suivi

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

Vous pouvez arrêter le suivi du nom de processus, du PID ou du « tout » spécifié.

-wait <timeout>

Attendez jusqu’à la quantité de secondes spécifiée pour que toutes les sessions de suivi sur le système se terminent. Spécifiez -1 pour attendre à l’infini.

-tracingOff

Démarre l’application avec l’enregistrement de trace désactivé. Vous pouvez utiliser la case à cocher de l’interface utilisateur pour réactiver le suivi une fois qu’il a été désactivé.

Options de ligne de commande supplémentaires

-children

Enregistrez la cible ainsi que tous les processus créés par la cible. Chaque processus enfant est enregistré dans son propre fichier de trace.

-cmdLineFilter "<string>"

Enregistrez la cible si sa ligne de commande contient la chaîne. Cette option fonctionne uniquement avec le -monitor mode. Il est utile dans les situations où l’argument de ligne de commande identifie de manière unique le processus qui vous intéresse. Par exemple, -monitor notepad.exe -cmdLineFilter "specialfile.txt" les enregistrements notepad.exe uniquement si specialfile.txt apparaît sur la ligne de commande.

-cleanup

Désinstallez le pilote de moniteur de processus.

Paramètres de comportement des traces

-timestampFilename

Ajoute un horodatage à la dernière partie du nom du fichier de trace. Par exemple, ping_2023-06-17_103116.run.

Par exemple, pour enregistrer ping.exe, avec un horodatage inclus dans le nom de fichier, utilisez cette commande.

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

Par défaut, une analyse séquentielle est effectuée pour rechercher un fichier inutilisé dans le répertoire de sortie. Si ping.exe est enregistré, l’enregistreur essaiera ping01.run, ping02.run, etc. jusqu’à ce qu’un nom de fichier inutilisé soit trouvé. Pour la plupart des scénarios, cette méthode de nommage est suffisante. Toutefois, si vous souhaitez enregistrer le même programme plusieurs fois, l’algorithme de nommage de fichier par défaut peut devenir inefficace, lorsqu’il existe un grand nombre de fichiers existants.

-ring

Tracez une mémoire tampon en anneau. La taille du fichier n’augmentera pas au-delà des limites spécifiées par -maxFile. Seule la dernière partie de l’enregistrement qui correspond à la taille donnée sera enregistrée.

-maxFile <size>

Taille maximale du fichier de trace en Mo. En mode trace complète, la valeur par défaut est de 1 024 Go et la valeur minimale est de 1 Mo. En mode mémoire tampon en anneau, la valeur par défaut est 2048 Mo, la valeur minimale est 1 Mo et la valeur maximale est 32768 Mo.

La valeur par défaut pour l’anneau en mémoire sur les processus 32 bits est de 256 Mo.

-maxConcurrentRecordings <count>

Nombre maximal d’enregistrements qui peuvent être en cours à un moment donné. Si ce n’est pas spécifié, un nombre illimité d’enregistrements peut se produire simultanément.

-numVCpu <number>

Spécifie un certain nombre d’UC virtuelles à réserver et à utiliser lors du suivi. Cette valeur affecte la surcharge de mémoire totale placée sur la mémoire du processus invité par TTD. S’il n’est pas spécifié, la valeur par défaut par plateforme est : 55 pour x64/ARM64 et 32 pour x86.

Modifiez ce paramètre afin de limiter l’impact sur la mémoire uniquement si vous manquez de mémoire. La modification de la valeur numVCpu par un nombre inférieur peut avoir un impact grave sur les performances du suivi et ne doit être effectuée que pour contourner les problèmes d’utilisation de la mémoire.

Si TTD.exe ne parvient pas à enregistrer ou si le fichier .out indique une simulation de 0 seconde, l’utilisation -numVCpu peut permettre la réussite de l’enregistrement.

-replayCpuSupport <support>

Spécifie la prise en charge attendue des processeurs qui seront utilisés pour relire la trace. Le paramètre par défaut est recommandé pour la portabilité des traces entre les machines, mais d’autres options peuvent être utilisées pour produire de petits fichiers de traces et enregistrer plus rapidement (en fonction des instructions spécifiques utilisées par le programme cible).

<support> Valeurs

Valeur Description
Default La prise en charge du processeur par défaut nécessite simplement une prise en charge de base couramment disponible dans le processeur de relecture.
MostConservative Ne nécessite aucune prise en charge spéciale dans le processeur de relecture. Adéquat pour les traces qui seront relues sur une architecture de processeur complètement différente, comme une trace Intel sur le processeur ARM64.
MostAggressive Suppose que le processeur de relecture sera similaire et que sa capacité sera égale ou supérieure à celle de l’UC utilisée pour enregistrer.
IntelAvxRequired Suppose que le processeur de relecture sera Intel/AMD 64 bits prenant en charge AVX.
IntelAvx2Required Suppose que le processeur de relecture sera Intel/AMD 64 bits prenant en charge AVX2.

Réduction de la surcharge liée au suivi

Bien que le TTD soit très efficace pour ce qu’il fait (suivi complet au niveau de l’instruction encodé en moins d’un octet/instruction en moyenne), il présente toujours une surcharge notable lors de l’enregistrement. Les processeurs modernes peuvent exécuter des milliards d’instructions par seconde, ce qui rend même un octet/instruction coûteux. Dans de nombreux cas, l’enregistrement de l’ensemble du processus n’est pas nécessaire.

Les options suivantes peuvent être utilisées pour réduire la surcharge liée au suivi :

-module <module name>

Enregistrez uniquement le module spécifié (par exemple, comdlg32.dll) et le code qu’il appelle. Il peut s’agir de l’exécutable lui-même ou d’une DLL chargée par l’exécutable. Cette option peut être spécifiée plusieurs fois pour enregistrer plusieurs modules.

Lorsque cette option est utilisée, le processus cible s’exécute à pleine vitesse jusqu’à ce que le code dans le ou les modules spécifiés soit exécuté. TTD enregistre ensuite le processus jusqu’à ce que l’exécution quitte le ou les modules spécifiés, à partir duquel l’enregistrement est désactivé et la cible revient à pleine vitesse. Étant donné que l’activation/la désactivation de l’enregistrement est coûteuse, TTD laisse l’enregistrement activé lorsqu’un module spécifié appelle d’autres modules dans le processus.

-recordmode <Automatic | Manual>

Normalement, l’enregistrement démarre dès que TTD s’injecte lui-même dans le processus cible (mode « Automatique », la valeur par défaut). Si votre programme utilise l’API d’enregistrement in-process de TTD pour contrôler le moment où l’enregistrement se produit, vous pouvez utiliser le mode « Manuel » pour s’exécuter à pleine vitesse jusqu’à ce que votre programme appelle l’API pour démarrer l’enregistrement.

L’utilisation de ces options peut entraîner une réduction significative de la surcharge d’enregistrement et de la taille du fichier de suivi. Le débogage d’une trace enregistrée avec ces options n’est pas différent d’une trace de l’ensemble du processus. Chaque fois que vous atteignez un emplacement dans la trace où l’enregistrement est désactivé, l’instruction suivante dans la trace est la première instruction exécutée lors de la reprise de l’enregistrement.

-passThroughExit

Transmettez la valeur de sortie du processus invité en tant que valeur de sortie de TTD.exe. Cette valeur est disponible pour les fichiers batch via la %ERRORLEVEL% variable . PowerShell et d’autres environnements de ligne de commande offrent également des mécanismes permettant d’obtenir la valeur de sortie du processus.

-onInitCompleteEvent <eventName>

Permet de signaler un événement à la fin de l’initialisation du suivi.

Exemples d’utilisation de scénarios - enregistrement d’un processus

Scénario : lancer et enregistrer une application Windows

Dans ce scénario, le bloc-notes est lancé et une trace est créée.

  1. Utilisez l’option pour démarrer le -launch Bloc-notes et l’enregistrer.
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. Un petit menu d’application s’affiche montrant que le suivi est activé.

Capture d’écran de l’interface utilisateur TTD affichant des status de suivi et un bouton Quitter l’application.

  1. Lorsque l’application est fermée, un fichier de trace est généré. Dans cet exemple notepad01.run.

Scénario : lancer et enregistrer une application Windows avec un paramètre passé

Dans ce scénario, le test ping est démarré et l’adresse à ping est passée en tant que paramètre.

  1. Dans cet exemple, l’option -launch est omise, car il s’agit du mode par défaut.
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. Lorsque l’application est fermée, un fichier de trace est généré. Dans cet exemple ping01.run.

Scénario - Localiser et attacher à un processus en cours d’exécution

Dans ce scénario, le bloc-notes est démarré, son ID de processus se trouve et une trace est créée en attachant à l’application en cours d’exécution

  1. Démarrez l’application cible, dans cet exemple de bloc-notes.

  2. Utilisez TaskList ou d’autres méthodes décrites dans pour localiser l’ID de processus. Pour plus d’informations, consultez Recherche de l’ID de processus.

C:\TTD> TaskList
...
Notepad.exe                  21440 Console                    1     73,020 K
...
  1. À l’aide de cet ID de processus, utilisez l’option -attach pour l’attacher et l’enregistrer. Spécifiez éventuellement un nom de fichier pour le fichier de trace à l’aide -outde .
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

Scénario - Enregistrement d’un parent et de ses processus enfants

Dans ce scénario, un parent et ses enfants sont enregistrés. Comme certaines applications peuvent utiliser de nombreux processus enfants, le fichier de trace de la famille qui contient les enfants peut devenir assez volumineux.

  1. Spécifiez l’option -children et le nom de l’application parente à enregistrer.

Il s’agit d’un exemple d’enregistrement cmd.exe de lancement d'ping.exe en tant que processus enfant.

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. Plusieurs fichiers de trace sont créés : un pour le processus parent et un fichier de trace pour chaque processus enfant. WinDbg n’ouvre qu’un seul fichier de trace à la fois. Vous devez donc exécuter des instances distinctes de WinDbg pour chaque trace, si vous souhaitez les déboguer en même temps.

Exemples d’utilisation de scénarios - Processus de supervision

Scénario : surveillance des lancements de programmes et démarrage de l’enregistrement

Dans ce scénario, l’option -monitor est utilisée pour enregistrer toutes les instances en cours d’exécution ainsi que les instances futures de notepad.exe, jusqu’à ce que le système soit redémarré ou ttd.exe soit arrêté via Ctrl+C. L’option -out est requise pour le moniteur, et le dossier de sortie doit déjà exister.

  1. Surveillez et tracez les instances actuelles et futures de 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. Dans cet exemple, deux instances de notepad.exe ont été chargées après le démarrage du suivi. Une fois l’activité intéressante capturée, CTRL-C a été utilisé à l’invite de commandes pour arrêter l’enregistrement.

Scénario : surveillance de deux programmes pour les lancements de programmes

Dans ce scénario, l’option -monitor est utilisée pour surveiller et enregistrer deux applications.

  1. Surveillez et suivez les instances actuelles, ainsi que les instances futures de notepad.exe et de 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. Dans cet exemple, notepad.exe, puis ping.exe ont été chargés après le démarrage du suivi. Une fois l’activité intéressante capturée, CTRL-C a été utilisé à l’invite de commandes pour arrêter l’enregistrement.

Scénario - Arrêt de l’enregistrement dans une deuxième fenêtre

Dans ce scénario, l’activité intéressante a été capturée et tout l’enregistrement est arrêté à l’aide -stop allde . Une deuxième fenêtre de commande est utilisée pour exécuter l’option -stop all .

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

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

Scénario - Nettoyage du pilote de moniteur

Dans ce scénario, l’option -cleanup est utilisée pour propre le pilote du moniteur une fois l’enregistrement terminé.

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

Exemples de ligne de commande supplémentaires

Ce tableau met en évidence d’autres exemples d’utilisation de la ligne de commande. Reportez-vous aux options de ligne de commande pour plus d’informations sur les options illustrées.

Scénario Commande Description
Attacher au processus, mais ne pas démarrer encore l’enregistrement Ttd.exe -tracingoff notepad.exe Lance le Bloc-notes avec l’enregistrement désactivé. L’enregistrement peut être démarré à tout moment via l’interface utilisateur.
Filtrer par ligne de commande Ttd.exe -cmdlinefilter foo.txt -monitor notepad.exe Enregistrez notepad.exe, mais uniquement si foo.txt se trouve sur la ligne de commande lors de son lancement, en plaçant la sortie dans le répertoire actif.
Enregistrement en anneau Ttd.exe -ring -attach 1234 Enregistre le PID 1234 dans un fichier de trace limité à 2 Go, en plaçant la sortie dans le répertoire actif. Le contenu plus ancien du fichier de trace est remplacé en fonction des besoins pour conserver le fichier sous la taille maximale.

Utilisez -maxfile pour modifier la taille maximale.
Limiter la taille du fichier de trace Ttd.exe -maxfile 4096 notepad.exe Enregistrez notepad.exe jusqu’à ce que le fichier de trace atteigne 4 Go, en plaçant la sortie dans le répertoire actif.
Limiter le nombre d’enregistrements qui se produisent en même temps Ttd.exe -maxconcurrentrecordings 1 -out c:\my\dir -monitor notepad.exe L’enregistrement est gourmand en ressources processeur et dans certains cas.
Réduire l’utilisation de la mémoire dans le processus cible Ttd.exe -numvcpu 8 -monitor w3wp.exe Certains processus, tels que w3wp.exe, définissent un petit quota sur la quantité de mémoire qu’il peut utiliser. Si ttd.exe ne parvient pas à démarrer l’enregistrement, utilisez -numvcpu pour réduire le nombre d’allocations TTD de processeurs virtuels. Essayez cette option uniquement si ttd.exe ne parvient pas à enregistrer par d’autres moyens.
Choisir entre la portabilité des traces et la vitesse d’enregistrement/taille du fichier de trace Ttd.exe -replaycpusupport mostaggressive notepad.exe Par défaut, TTD produit des fichiers de trace portables sur un large éventail de matériel. Le choix de « mostaggressive » indique à TTD qu’il est possible d’enregistrer une trace qui ne peut être lue que sur les processeurs avec les mêmes fonctionnalités que la machine qui a enregistré la trace. Dans certains cas, cela peut considérablement améliorer la vitesse d’enregistrement et la taille du fichier de trace.

Exemples de ligne de commande Automation

Ce tableau met en évidence certains exemples d’utilisation de ligne de commande supplémentaires qui peuvent être utiles pour l’utilisation automatisée de TTD.exe utilitaire.

Scénario Commande Description
Désactiver l’interface utilisateur Ttd.exe -noui -accepteula notepad.exe Enregistrez notepad.exe, en plaçant la sortie dans le répertoire actif, sans afficher l’interface utilisateur.
Attendez que l’enregistreur démarre par programmation Ttd.exe -accepteula -oninitcompleteevent ttd_notepad notepad.exe Créez un événement nommé Win32 « ttd_notepad » et lancez notepad.exe. TTD signale « ttd_notepad » lors de l’initialisation de l’enregistrement. Automation peut attendre l’événement avant de poursuivre le comportement qu’elle souhaite enregistrer.
Conserver le code de sortie de la cible Ttd.exe -accepteula -passthroughexit ping.exe msn.com Enregistre ping.exe, en plaçant la sortie dans le répertoire actif. le code de sortie de Ttd.exe sera le même que le code de sortie de ping.exe.
Attendre la fin de l’enregistrement Ttd.exe -accepteula -wait 30 Une fois l’enregistrement arrêté, attendez jusqu’à 30 secondes que TTD termine l’écriture du fichier de trace sur le disque. Utilisez -wait -1 pour attendre indéfiniment.

Tous ces exemples utilisent l’option -accepteula pour s’assurer que l’automatisation n’est pas bloquée par la boîte de dialogue de confirmation du CLUF.

Utilisation du fichier de trace généré

Pour plus d’informations sur l’utilisation d’une trace et des instructions sur la façon de relire les traces de voyage dans le temps et de naviguer vers l’avant et vers l’arrière dans le temps, consultez Débogage de voyage dans le temps - Relire une trace.

Conseils sur l’utilisation des fichiers de trace

  • Lorsque vous partagez des traces avec d’autres personnes, vous devez uniquement partager le fichier .run. Le fichier d’index (.idx) peut être aussi volumineux que le fichier .run et est créé automatiquement lorsque le fichier de trace est chargé par WinDbg.
  • Lorsque vous collaborez avec d’autres personnes, transmettez les positions de trace pertinentes liées au problème en question. Le collaborateur peut utiliser la !tt x:y commande pour passer à ce point précis dans le temps dans l’exécution du code. Les plages de position de temps peuvent être incluses dans les descriptions de bogues pour suivre l’endroit où le problème possible peut se produire.
  • Lorsque vous signalez un problème avec TTD, si vous fournissez le fichier .run, fournissez également le fichier .out. Cela permet de confirmer que le processus d’enregistrement a fonctionné correctement.
  • Les fichiers de trace (.run) se compressent correctement.

Résolution des problèmes TTD.exe

Dans certains cas, des erreurs de fichier de trace peuvent se produire. Pour plus d’informations, consultez Débogage de voyage dans le temps - Résolution des problèmes.

Le fichier .out peut être utilisé pour la résolution des problèmes. L’exemple de fichier de sortie montre une trace fonctionnelle, se terminant par un code de sortie de zéro.

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 majeure partie du contenu du fichier .out est utilisée en interne par l’équipe de débogage de voyage dans le temps pour résoudre les erreurs d’enregistrement. Les informations suivantes peuvent être utiles à d’autres personnes qui travaillent avec le fichier de trace.

  • Certains messages d’erreur s’affichent uniquement dans le fichier .out et peuvent être utilisés pour déterminer les spécificités de l’échec.
  • Indication de l’horloge murale pendant laquelle l’enregistrement a démarré/arrêté
  • Durée de la session d’enregistrement (durée de simulation)
  • Indique si l’enregistrement est un enregistrement de lancement (avec ligne de commande) ou d’attachement
  • Version du système d’exploitation

Voir aussi

Débogage de voyage dans le temps - Vue d’ensemble

Débogage de voyage dans le temps - Enregistrer une trace

Débogage de voyage dans le temps - Relire une trace