Depuración de viajes de tiempo: TTD.exe utilidad de línea de comandos

Logotipo de depuración de viajes de tiempo con un reloj.

En este artículo se describe cuándo y cómo usar la utilidad de línea de comandos TTD.exe para registrar un seguimiento.

Cuándo usar la utilidad de línea de comandos TTD.exe

La depuración de viajes de tiempo (TTD) permite registrar la ejecución de código de una aplicación o proceso y guardarla en un archivo de seguimiento. El archivo se puede reproducir en el depurador de Windows para buscar un problema con la ejecución del código.

En muchos escenarios, la manera más fácil de usar TTD para registrar una aplicación o proceso es directamente desde la interfaz de usuario de WinDbg. Para obtener información sobre la depuración de viajes de tiempo mediante la interfaz de usuario de WinDbg, consulte Time Travel Debugging - Overview( Depuración de viajes de tiempo: información general).

Es posible que tenga escenarios en los que solo se requiera la grabadora de línea de comandos TTD: grabación en un equipo sin instalar el depurador, escenarios avanzados de grabación, automatización de pruebas, etc. En estos escenarios, puede instalar solo la grabadora de línea de comandos TTD a través de una dirección URL.

La grabación TTD afecta al proceso grabado

La grabación TTD es una tecnología invasiva. Observará que en cualquier lugar desde 5x-20x o más ralentización de la aplicación o proceso en ejecución durante la grabación, dependiendo de la aplicación y las opciones de grabación seleccionadas.

Los archivos de seguimiento creados crecen con el tiempo y pueden tomar un espacio de almacenamiento significativo. Trabaje para realizar un seguimiento durante el período de tiempo más corto, capturar la actividad del programa de interés y, a continuación, cerrar el seguimiento lo antes posible.

Una vez que TTD se adjunta a un proceso, no se puede quitar de él. Cierre la aplicación o finalice el proceso una vez completada la grabación TTD. En el caso de los procesos críticos para el sistema, esto requerirá un reinicio del sistema operativo.

Las grabaciones TTD capturan el contenido de la memoria y pueden contener información relacionada con la seguridad o de identificación personal, incluidos, entre otros, las rutas de acceso a archivos, el registro, la memoria o el contenido del archivo. La información exacta depende de la actividad del proceso de destino mientras se registró.

Cómo descargar e instalar la utilidad de línea de comandos TTD.exe (método preferido)

Descargue la utilidad de línea de comandos TTD aquí: https://aka.ms/ttd/download

Seleccione Instalar y TTD descargará e instalará. El comando TTD se agrega a la ruta de acceso del sistema y está disponible para su uso en el símbolo del sistema cuando se completa la instalación.

Si tiene dificultades para la instalación, consulte Solución de problemas de instalación con el archivo instalador de la aplicación.

En algunos equipos es posible que tenga que instalar el Instalador de aplicación de Microsoft para Windows 10. Está disponible en la aplicación Microsoft Store en Windows. Administrador de paquetes de Windows se admite a través del Instalador de aplicaciones a partir de Windows 10 1809.

Cómo descargar e instalar la utilidad de línea de comandos TTD.exe (método sin conexión)

Aunque el método de instalación preferido es usar el Instalador de aplicación, también puede descargar el paquete de línea de comandos TTD y extraer los archivos manualmente. Estas son dos maneras de hacerlo.

Extraer los archivos de una utilidad de línea de comandos TTD.exe ya instalada

Si ya ha instalado la utilidad de línea de comandos TTD, puede extraer los archivos de la ubicación instalada. En PowerShell, lo haría para encontrar la ubicación instalada:

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

Desde allí puede copiar todos los archivos binarios (*.dll, *.exe, *.sys) en una nueva ubicación. Esta es una manera de hacerlo en PowerShell:

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

Reemplace "c:\myttd" por el destino que prefiera. El resultado tendrá un aspecto similar al siguiente (en una máquina 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

Tenga en cuenta que los archivos binarios x86 están en un subdirectorio. Si no necesita registrar procesos de 32 bits, esta carpeta se puede eliminar (y podría agregar /xd x86 al comando robocopy para evitar copiarla en primer lugar). La versión arm64 no tiene subdirectorios.

El TTDRecordUI.dll solo es necesario si desea usar la interfaz de usuario para controlar la grabación. Si no desea la interfaz de usuario, puede eliminar este archivo.

Descargue el paquete de la utilidad de línea de comandos TTD.exe y extraiga los archivos manualmente.

Si no desea instalar la utilidad de línea de comandos TTD, puede descargar el paquete y extraer los archivos manualmente. El siguiente script de PowerShell:

  • Obtenga la dirección URL de la versión actual de TTD desde https://aka.ms/ttd/download.
  • Descargue el paquete MSIX.
  • Extraiga el archivo MSIX de la arquitectura solicitada de la agrupación MSIX.
  • Extraiga los archivos binarios 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."
}

Suponiendo que guardó el script anterior como Get-Ttd.ps1, puede ejecutarlo como este para descargar los archivos binarios x64 en el directorio c:\myttd:

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

O bien, puede especificar el directorio de salida y la arquitectura:

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

Reemplace "c:\myttd" o "c:\myttd-arm64" por el destino que prefiera.

Cómo registrar un seguimiento mediante la utilidad de línea de comandos TTD.exe

Hay tres maneras de registrar un seguimiento.

  • Iniciar un proceso
  • Asociación a un proceso
  • Supervisión de un proceso

Una vez registrado el proceso, debe desencadenar el problema que desea depurar. Puede abrir un archivo problemático o hacer clic en un botón específico de la aplicación para que se produzca el evento de interés. Cuando la aplicación que se registra finaliza, naturalmente o bloqueando, se finalizará el archivo de seguimiento.

Sugerencia

La grabación de seguimientos TTD requiere derechos administrativos. Normalmente, esto se realiza mediante la ejecución de ttd.exe desde un símbolo del sistema del administrador.

Para obtener más información sobre cómo grabar un seguimiento de viaje en el tiempo mediante WinDbg, vea Time Travel Debugging - Record a trace.

Iniciar un proceso

-launch <Program> [<arguments>]

Inicie y realice un seguimiento del programa (modo predeterminado).

Este es el único modo que permite pasar argumentos al programa. El programa se iniciará con los mismos privilegios que TTD.exe (como administrador). Use -attach o -monitor para registrar el programa con su conjunto normal de privilegios.

La inclusión -launch es opcional, pero se puede usar para mayor claridad.

El primer argumento no reconocido que no empieza por - o / se supone que es una ruta de acceso ejecutable para iniciarse, y se supone que los argumentos posteriores son los argumentos de ese programa.

Por ejemplo, use TTD.exe notepad.exe para iniciar y grabar el Bloc de notas. El seguimiento se detendrá al cerrar el Bloc de notas.

Por ejemplo, consulte Ejemplos de uso de escenarios: grabación de un proceso.

Asociación a un proceso

-attach <PID>

Adjunte a un proceso en ejecución especificado por el identificador de proceso. Use TaskManager o la utilidad TaskList para identificar los números de proceso. Para obtener más información, consulte Búsqueda del identificador de proceso.

Por ejemplo, use TTD.exe -attach 21440 -out C:\traces\MyTraceFile.run para iniciar y registrar el proceso con y el identificador de 21440 y guarde el seguimiento en MyTraceFile.run.

Asegúrese de que el directorio existe (C:\traces en este ejemplo) antes de ejecutar TTD.exe.

Por ejemplo, consulte Escenario: buscar y adjuntar a un proceso en ejecución.

Supervisión de un proceso

-monitor <Program>

La opción monitor permite supervisar y realizar un seguimiento de un programa cada vez que se inician. Para usar esta opción, debe especificar una ruta de acceso completa a la ubicación de salida con -out.

Para detener la supervisión, presione Ctrl+C.

Las principales ventajas de la supervisión en comparación con los otros métodos son:

  • Puede iniciar la aplicación de destino de la manera normal, no es necesario averiguar la línea de comandos para iniciarla.
  • La aplicación de destino se ejecutará con sus privilegios normales. Si inicias la aplicación directamente desde ttd.exe se iniciará con privilegios elevados y eso puede cambiar el comportamiento del programa.
  • Resulta útil para la automatización (use un script que supervise el inicio de un programa y recopile un seguimiento).

La opción -monitor se puede especificar más de una vez para supervisar varios programas.

Por ejemplo, consulte Ejemplos de uso de escenarios: procesos de supervisión.

Opciones de línea de comandos

Syntax

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

-? | -help

Muestra la ayuda de la línea de comandos.

Modos

-launch <Program> [<arguments>]

Inicie y realice un seguimiento del programa (modo predeterminado).

Este es el único modo que permite pasar argumentos al programa. La -launch opción debe ser la última opción TTD en la línea de comandos, seguida del programa que se va a iniciar y los argumentos que requiera el programa. Si no se especifica ningún modo, también se tratará como inicio. Por ejemplo TTD.exe -out C:\traces ping.exe msn.com , se trata como un inicio.

-attach <PID>

Adjunte a un proceso en ejecución especificado por el identificador de proceso. Use la utilidad TaskManager o TaskList para identificar los identificadores de proceso. Para obtener más información, consulte Búsqueda del identificador de proceso.

-monitor <Program>

Realice un seguimiento de los programas o servicios cada vez que se inicien (hasta el reinicio). Para usar esta opción, debe especificar una ruta de acceso completa a la ubicación de salida con -out.

Opciones básicas de la línea de comandos

-out <path>

Especifique un nombre de archivo de seguimiento o un directorio. Si es un directorio, el directorio ya debe existir. Si un nombre de archivo, el nombre de archivo no debe existir.

-noUI

Deshabilita la interfaz de usuario para el control manual de la grabación.

Si esta opción no está seleccionada, se muestra una interfaz de usuario pequeña cuando la grabación está activa. "Seguimiento desactivado" detiene el seguimiento y la aplicación continúa; "Exit App" cierra la aplicación que también detiene el seguimiento.

Captura de pantalla de la interfaz de usuario TTD pequeña de dos botones que muestra el estado de seguimiento y un botón Salir de la aplicación.

-accepteula

Use esta opción para aceptar el contrato de licencia de usuario del CLUF. Esta opción se puede usar en escenarios de automatización, una vez revisado y aceptado el CLUF.

TTD muestra el CLUF la primera vez que se ejecuta. Escriba Y o N para aceptar el CLUF. Una vez aceptado, el ELA ya no se mostrará en el inicio. Si el CLUF no se acepta, se cierra TTD y se mostrará el CLUF, la próxima vez que se ejecute TTD.

Control de seguimiento

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

Detenga el seguimiento del nombre de proceso especificado, PID o "all" se puede especificar.

-wait <timeout>

Espere hasta la cantidad de segundos especificados para que todas las sesiones de seguimiento del sistema finalicen. Especifique -1 para esperar infinitamente.

-tracingOff

Inicia la aplicación con la grabación de seguimiento desactivada. Puede usar la casilla ui para volver a activar el seguimiento después de que se haya desactivado.

Opciones adicionales de la línea de comandos

-children

Registre el destino, así como los procesos creados por el destino. Cada proceso secundario se registrará en su propio archivo de seguimiento.

-cmdLineFilter "<string>"

Registre el destino si su línea de comandos contiene la cadena. Esta opción solo funciona con -monitor el modo . Resulta útil para situaciones en las que el argumento de la línea de comandos identifica de forma única el proceso que le interesa. Por ejemplo, -monitor notepad.exe -cmdLineFilter "specialfile.txt" registra notepad.exe solo si specialfile.txt aparece en la línea de comandos.

-cleanup

Desinstale el controlador de supervisión de procesos.

Configuración del comportamiento de seguimiento

-timestampFilename

Agrega una marca de tiempo a la última parte del nombre del archivo de seguimiento. Por ejemplo, ping_2023-06-17_103116.run.

Por ejemplo, para registrar ping.exe, con una marca de tiempo incluida en el nombre de archivo, use este comando.

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

De forma predeterminada, se realiza un examen secuencial para buscar un archivo sin usar en el directorio de salida. Si ping.exe está grabado, la grabadora probará ping01.run, ping02.run, etc. hasta que se encuentre un nombre de archivo sin usar. Para la mayoría de los escenarios, este método de nomenclatura es suficiente. Sin embargo, si desea registrar el mismo programa muchas veces, el algoritmo de nomenclatura de archivos predeterminado puede ser ineficaz, cuando hay un gran número de archivos existentes.

-ring

Seguimiento a un búfer de anillo. El tamaño del archivo no aumentará más allá de los límites especificados por -maxFile. Solo se guardará la última parte de la grabación que se ajuste al tamaño especificado.

-maxFile <size>

Tamaño máximo del archivo de seguimiento en MB. Cuando en modo de seguimiento completo, el valor predeterminado es 1024 GB y el valor mínimo es 1 MB. Cuando en el modo de búfer en anillo el valor predeterminado es 2048 MB, el valor mínimo es 1 MB y el valor máximo es 32768 MB.

El valor predeterminado para el anillo en memoria en los procesos de 32 bits es de 256 MB.

-maxConcurrentRecordings <count>

Número máximo de grabaciones que pueden estar en curso en un momento dado. Si no se especifica, se puede producir simultáneamente un número ilimitado de grabaciones.

-numVCpu <number>

Especifica una serie de CPU virtuales que se van a reservar y usar al realizar el seguimiento. Este valor afecta a la sobrecarga total de memoria colocada en la memoria del proceso invitado por TTD. Si no se especifica, el valor predeterminado por plataforma es: 55 para x64/ARM64 y 32 para x86.

Cambie esta configuración para limitar el impacto en la memoria solo si se está quedando sin memoria. Cambiar el valor numVCpu a un número inferior puede afectar gravemente al rendimiento del seguimiento y solo debe realizarse para solucionar problemas de uso de memoria.

Si TTD.exe no se puede grabar o el archivo .out indica una simulación de 0 segundos, el uso -numVCpu de puede permitir que la grabación se realice correctamente.

-replayCpuSupport <support>

Especifica qué compatibilidad se espera de las CPU que se usarán para reproducir el seguimiento. Se recomienda la configuración predeterminada para la portabilidad de seguimientos entre máquinas, pero se pueden usar otras opciones para generar archivos de seguimiento pequeños y registrar más rápido (en función de las instrucciones específicas usadas por el programa de destino).

Valores <support>

Valor Descripción
Default La compatibilidad con CPU predeterminada solo requiere compatibilidad básica con disponibilidad habitual en la CPU de reproducción.
MostConservative No requiere compatibilidad especial en la CPU de reproducción. Adecuado para los seguimientos que se reproducirán en una arquitectura de CPU completamente diferente, como un seguimiento de Intel en la CPU ARM64.
MostAggressive Supone que la CPU de reproducción será similar y igual o mayor que la CPU usada para grabar.
IntelAvxRequired Supone que la CPU de reproducción será CPU intel/AMD de 64 bits compatible con AVX.
IntelAvx2Required Supone que la CPU de reproducción será CPU intel/AMD de 64 bits compatible con AVX2.

Reducción de la sobrecarga del seguimiento

Aunque TTD es muy eficaz para lo que hace (seguimiento de nivel de instrucción completo codificado en menos de un byte o instrucción en promedio), todavía tiene una sobrecarga notable al grabar. Las CPU modernas pueden ejecutar miles de millones de instrucciones por segundo, lo que hace que incluso un byte o instrucción sea costoso. En muchos casos, no es necesario registrar todo el proceso.

Las siguientes opciones se pueden usar para reducir la sobrecarga del seguimiento:

-module <module name>

Registre solo el módulo especificado (por ejemplo, comdlg32.dll) y el código al que llama. Puede ser el propio archivo ejecutable o cualquier archivo DLL cargado por el ejecutable. Esta opción se puede especificar más de una vez para registrar varios módulos.

Cuando se usa esta opción, el proceso de destino se ejecuta a toda velocidad hasta que se ejecuta código en los módulos especificados. TTD registrará el proceso hasta que la ejecución deje los módulos especificados, en el que la grabación de punto está desactivada y el destino vuelve a toda la velocidad. Dado que la activación o desactivación de la grabación es costosa, TTD dejará la grabación cuando un módulo especificado llame a otros módulos del proceso.

-recordmode <Automatic | Manual>

Normalmente, la grabación se inicia tan pronto como TTD se inserta en el proceso de destino ("Automático", el valor predeterminado). Si el programa usa la API de grabación en proceso de TTD para controlar cuándo se produce la grabación, puede usar el modo "Manual" para ejecutarse a toda velocidad hasta que el programa llame a la API para iniciar la grabación.

El uso de estas opciones puede provocar una reducción significativa de la sobrecarga de grabación y el tamaño del archivo de seguimiento. La depuración de un seguimiento registrado con estas opciones no es diferente de un seguimiento de todo el proceso. Cada vez que llegue a una ubicación en el seguimiento donde se desactiva la grabación, la siguiente instrucción del seguimiento es la primera instrucción ejecutada al reanudar la grabación.

-passThroughExit

Pase el valor de salida del proceso invitado a través como valor de salida de TTD.exe. Este valor está disponible para los archivos por lotes a través de la %ERRORLEVEL% variable . PowerShell y otros entornos de línea de comandos también ofrecen mecanismos para obtener el valor de salida del proceso.

-onInitCompleteEvent <eventName>

Permite indicar un evento cuando se completa la inicialización del seguimiento.

Ejemplos de uso de escenarios: grabación de un proceso

Escenario: inicio y registro de una aplicación de Windows

En este escenario se inicia el Bloc de notas y se crea un seguimiento.

  1. Use la opción para iniciar el -launch Bloc de notas y grabarlo.
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. Se muestra un menú de aplicación pequeño en el que se muestra que el seguimiento está activado.

Captura de pantalla de la interfaz de usuario TTD que muestra el estado de seguimiento y un botón Salir de la aplicación.

  1. Cuando se cierra la aplicación, se genera un archivo de seguimiento. En este bloc de notas de ejemplo01.run.

Escenario: inicio y registro de una aplicación de Windows con un parámetro pasado

En este escenario se inicia ping y la dirección a ping se pasa como parámetro.

  1. En este ejemplo, la -launch opción se omite como el modo predeterminado.
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. Cuando se cierra la aplicación, se genera un archivo de seguimiento. En este ejemplo, ping01.run.

Escenario: buscar y adjuntar a un proceso en ejecución

En este escenario se inicia el Bloc de notas, se encuentra su identificador de proceso y se crea un seguimiento mediante la asociación a la aplicación en ejecución.

  1. Inicie la aplicación de destino, en este Bloc de notas de ejemplo.

  2. Use TaskList u otros métodos descritos en para buscar el identificador de proceso. Para obtener más información, consulte Búsqueda del identificador de proceso.

C:\TTD> TaskList
...
Notepad.exe                  21440 Console                    1     73,020 K
...
  1. Con ese identificador de proceso, use la -attach opción para adjuntarlo y registrarlo. Opcionalmente, especifique un nombre de archivo para el archivo de seguimiento mediante -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

Escenario: grabación de un elemento primario y sus procesos secundarios

En este escenario, se registrará un elemento primario y sus procesos secundarios. Dado que algunas aplicaciones pueden usar muchos procesos secundarios, el archivo de seguimiento de la familia que contiene los elementos secundarios puede llegar a ser bastante grande.

  1. Especifique la -children opción y el nombre de la aplicación primaria que se va a registrar.

Este es un ejemplo de grabación cmd.exe iniciar ping.exe como un proceso secundario.

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. Se crean varios archivos de seguimiento: uno para el proceso primario y un archivo de seguimiento para cada proceso secundario. WinDbg solo abre un archivo de seguimiento a la vez, por lo que tendrás que ejecutar instancias independientes de WinDbg para cada seguimiento, si quieres depurarlos al mismo tiempo.

Ejemplos de uso de escenarios: supervisión de procesos

Escenario: supervisión de inicios del programa e inicio de la grabación

En este escenario, la -monitor opción se usa para registrar todas las instancias en ejecución actualmente, así como futuras instancias de notepad.exe, hasta que se reinicie el sistema o ttd.exe se salga a través de Ctrl+C. La -out opción es necesaria para el monitor y la carpeta de salida ya debe existir.

  1. Supervise y realice un seguimiento del actual, así como cualquier instancia futura 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. En este ejemplo se cargaron dos instancias de notepad.exe después de iniciar el seguimiento. Después de capturar la actividad de interés, se usó CTRL-C en el símbolo del sistema para detener la grabación.

Escenario: supervisión de dos programas para lanzamientos de programas

En este escenario, la -monitor opción se usa para supervisar y registrar dos aplicaciones.

  1. Supervise y realice un seguimiento del actual, así como cualquier instancia futura de notepad.exe y 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. En este ejemplo notepad.exe y, a continuación, ping.exe se cargaron después de iniciar el seguimiento. Después de capturar la actividad de interés, se usó CTRL-C en el símbolo del sistema para detener la grabación.

Escenario: detener la grabación en una segunda ventana

En este escenario, se capturó la actividad de interés y se detiene toda la grabación mediante -stop all. Se usa una segunda ventana de comandos para ejecutar la -stop all opción .

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'

Escenario: Limpieza del controlador de supervisión

En este escenario, la -cleanup opción se usa para limpiar el controlador de monitor una vez completada toda la grabación.

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

Ejemplos de línea de comandos adicionales

En esta tabla se resaltan algunos ejemplos de uso de la línea de comandos adicionales. Consulte las opciones de línea de comandos para obtener información adicional sobre las opciones ilustradas.

Escenario Get-Help Descripción
Asociar al proceso, pero aún no iniciar la grabación Ttd.exe -tracingoff notepad.exe Inicia el Bloc de notas con grabación desactivada. La grabación se puede iniciar en cualquier momento a través de la interfaz de usuario.
Filtrar por línea de comandos Ttd.exe -cmdlinefilter foo.txt -monitor notepad.exe Registre notepad.exe, pero solo si foo.txt está en la línea de comandos cuando se inicia, colocando la salida en el directorio actual.
Grabación en anillo Ttd.exe -ring -attach 1234 Registra PID 1234 en un archivo de seguimiento limitado a 2 GB, colocando la salida en el directorio actual. El contenido anterior del archivo de seguimiento se sobrescribe según sea necesario para mantener el archivo con el tamaño máximo.

Use -maxfile para cambiar el tamaño máximo.
Limitar el tamaño del archivo de seguimiento Ttd.exe -maxfile 4096 notepad.exe Registre notepad.exe hasta que el archivo de seguimiento alcance los 4 GB, colocando la salida en el directorio actual.
Limitar el número de grabaciones que se producen al mismo tiempo Ttd.exe -maxconcurrentrecordings 1 -out c:\my\dir -monitor notepad.exe La grabación consume mucha CPU y en algunos casos.
Reducción del uso de memoria en el proceso de destino Ttd.exe -numvcpu 8 -monitor w3wp.exe Algunos procesos, como w3wp.exe, establecen una cuota pequeña en la cantidad de memoria que puede usar. Si ttd.exe no puede iniciar la grabación, use -numvcpu para reducir el número de CPU virtuales que asigna TTD. Pruebe esta opción solo si ttd.exe no puede registrar a través de otros medios.
Elegir entre portabilidad de seguimiento y velocidad de grabación/tamaño del archivo de seguimiento Ttd.exe -replaycpusupport mostaggressive notepad.exe De forma predeterminada, TTD genera archivos de seguimiento que son portátiles en una amplia gama de hardware. Elegir "mostaggressive" indica a TTD que es correcto registrar un seguimiento que solo se puede reproducir en las CPU con las mismas funcionalidades que la máquina que registró el seguimiento. En algunos casos, esto puede mejorar considerablemente la velocidad de grabación y el tamaño del archivo de seguimiento.

Ejemplos de línea de comandos de Automation

En esta tabla se resaltan algunos ejemplos de uso de línea de comandos adicionales que pueden ser útiles para el uso automatizado de TTD.exe utilidad.

Escenario Get-Help Descripción
Deshabilitar la interfaz de usuario Ttd.exe -noui -accepteula notepad.exe Registre notepad.exe, colocando la salida en el directorio actual, sin mostrar la interfaz de usuario.
Espere a que la grabadora se inicie mediante programación Ttd.exe -accepteula -oninitcompleteevent ttd_notepad notepad.exe Cree un evento denominado Win32 "ttd_notepad" e inicie notepad.exe. TTD indicará "ttd_notepad" al inicializar la grabación. La automatización puede esperar al evento antes de continuar con el comportamiento que quieren registrar.
Conservar el código de salida del destino Ttd.exe -accepteula -passthroughexit ping.exe msn.com Registra ping.exe, colocando la salida en el directorio actual. el código de salida de Ttd.exe será el mismo que el código de salida de ping.exe.
Espere a que finalice la grabación Ttd.exe -accepteula -wait 30 Una vez detenida la grabación, espere hasta 30 segundos para que TTD termine de escribir el archivo de seguimiento en el disco. Use -wait -1 para esperar indefinidamente.

Todos estos ejemplos usan la -accepteula opción para asegurarse de que el cuadro de diálogo de confirmación del CLUF no bloquea la automatización.

Trabajar con el archivo de seguimiento generado

Para obtener información sobre cómo trabajar con un seguimiento e instrucciones sobre cómo reproducir seguimientos de viaje en tiempo y navegar hacia delante y hacia atrás en el tiempo, vea Time Travel Debugging - Replay a trace.

Sugerencias para trabajar con archivos de seguimiento

  • Al compartir seguimientos con otros usuarios, solo tiene que compartir el archivo .run. El archivo de índice (.idx) puede ser tan grande como el archivo .run y se crea automáticamente cuando WinDbg carga el archivo de seguimiento.
  • Al colaborar con otros usuarios, pase las posiciones de seguimiento pertinentes relacionadas con el problema en cuestión. El colaborador puede usar el !tt x:y comando para desplazarse a ese momento exacto en el tiempo en la ejecución del código. Los intervalos de posición de tiempo se pueden incluir en descripciones de errores para realizar un seguimiento de dónde se puede producir el posible problema.
  • Al notificar un problema con TTD, si proporciona el archivo .run, proporcione también el archivo .out. Esto permite la confirmación de que el proceso de grabación funcionó correctamente.
  • Los archivos de seguimiento (.run) se comprimen bien.

Solución de problemas de TTD.exe

Hay algunos casos en los que se pueden producir errores de archivo de seguimiento. Para obtener más información, vea Time Travel Debugging - Troubleshooting.

El archivo .out se puede usar para solucionar problemas. El archivo de salida de ejemplo muestra un seguimiento funcional, que termina con un código de salida de cero.

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 mayoría del contenido del archivo .out se usa internamente en el equipo de depuración de viajes de tiempo para solucionar errores de grabación. La siguiente información puede ser útil para otros usuarios que trabajan con el archivo de seguimiento.

  • Algunos mensajes de error solo se muestran en el archivo .out y se pueden usar para determinar los detalles del error.
  • Indicación de la hora del reloj de la grabación iniciada/ detenida
  • Cuánto tiempo duró la sesión de grabación (hora de simulación)
  • Si la grabación es un inicio (con línea de comandos) o adjuntar grabación
  • La versión del sistema operativo

Consulte también

Depuración de viajes de tiempo: información general

Depuración de viajes de tiempo: registro de un seguimiento

Depuración de viajes de tiempo: reproducción de un seguimiento