Compartilhar via


Depuração de viagem no tempo - TTD.exe utilitário de linha de comando

Logotipo de depuração da viagem no tempo com um relógio.

Este artigo descreve quando e como usar o utilitário de linha de comando TTD.exe para registrar um rastreamento.

Quando usar o utilitário de linha de comando TTD.exe

A depuração de viagem no tempo (TTD) permite registrar a execução de código de um aplicativo ou processo e salvá-lo em um arquivo de rastreamento. O arquivo pode ser reproduzido no depurador do Windows para localizar um problema com a execução do código.

Para muitos cenários, a maneira mais fácil de usar o TTD para registrar um aplicativo ou processo é diretamente da interface do usuário do WinDbg. Para obter informações sobre a depuração de viagem no tempo usando a interface do usuário do WinDbg, consulte Depuração de viagem no tempo – visão geral.

Você pode ter cenários em que apenas o gravador de linha de comando TTD é necessário: gravação em um PC sem instalar o depurador, cenários avançados de gravação, automação de teste, etc. Nesses cenários, você pode instalar apenas o gravador de linha de comando TTD por meio de uma URL.

A gravação TTD afeta o processo gravado

A gravação TTD é uma tecnologia invasiva. Você notará de 5x a 20x ou mais lentidão do aplicativo ou processo em execução durante a gravação, dependendo do aplicativo e das opções de gravação selecionadas.

Os arquivos de rastreamento criados crescem com o tempo e podem ocupar um espaço de armazenamento significativo. Trabalhe para rastrear pelo menor período de tempo, capturando a atividade do programa de interesse e, em seguida, feche o rastreamento o mais rápido possível.

Uma vez que o TTD é anexado a um processo, ele não pode ser removido dele. Feche o aplicativo ou encerre o processo assim que a gravação do TTD estiver concluída. Para processos críticos do sistema, isso exigirá uma reinicialização do sistema operacional.

As gravações TTD capturam o conteúdo da memória e podem conter informações de identificação pessoal ou relacionadas à segurança, incluindo, mas não necessariamente se limitando a, caminhos de arquivo, registro, memória ou conteúdo de arquivo. As informações exatas dependem da atividade do processo de destino enquanto foram registradas.

Como baixar e instalar o utilitário de linha de comando TTD.exe (método preferencial)

Baixe o utilitário de linha de comando TTD aqui - https://aka.ms/ttd/download

Selecione Instalar e o TTD será baixado e instalado. O comando TTD é adicionado ao caminho do sistema e está disponível para uso no prompt de comando, quando a instalação for concluída.

Se você encontrar dificuldades para instalar, consulte Solucionar problemas de instalação com o arquivo do Instalador de Aplicativo.

Em alguns PCs, pode ser necessário instalar o Microsoft App Installer para Windows 10. Ele está disponível no aplicativo Microsoft Store no Windows. O Gerenciador de Pacotes do Windows é compatível com o Instalador de Aplicativo a partir do Windows 10 1809.

Como baixar e instalar o utilitário de linha de comando TTD.exe (método offline)

Embora o método de instalação preferido seja usar o App Installer, você também pode baixar o pacote de linha de comando TTD e extrair os arquivos manualmente. Aqui estão duas maneiras de fazer isso.

Extraia os arquivos de um utilitário de linha de comando TTD.exe já instalado

Se você já instalou o utilitário de linha de comando TTD, pode extrair os arquivos do local instalado. No Powershell, você faria isso para encontrar o local instalado:

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

A partir daí, você pode copiar todos os binários (*.dll, *.exe, *.sys) para um novo local. Aqui está uma maneira de fazer isso no Powershell:

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

Substitua "c:\myttd" pelo destino de sua escolha. O resultado será semelhante a este (em uma 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

Observe que os binários x86 estão em um subdiretório. Se você não precisar gravar processos de 32 bits, esta pasta pode ser excluída (e você pode adicionar /xd x86 ao comando robocopy para evitar copiá-la em primeiro lugar). A versão ARM64 não possui subdiretórios.

O TTDRecordUI.dll só é necessário se você quiser usar a interface do usuário para controlar a gravação. Se você não quiser a interface do usuário, poderá excluir esse arquivo.

Baixe o pacote de utilitários de linha de comando TTD.exe e extraia os arquivos manualmente

Se você não quiser instalar o utilitário de linha de comando TTD, poderá baixar o pacote e extrair os arquivos manualmente. O seguinte script do Powershell irá:

  • Obtenha o URL da versão atual do TTD em https://aka.ms/ttd/download.
  • Baixe o pacote MSIX.
  • Extraia o MSIX da arquitetura solicitada do pacote MSIX.
  • Extraia os binários TTD do 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."
}

Supondo que você salvou o script acima como Get-Ttd.ps1, você pode executá-lo assim para baixar os binários x64 para o diretório c:\myttd:

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

Ou você pode especificar o diretório de saída e a arquitetura:

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

Substitua "c:\myttd" ou "c:\myttd-arm64" pelo destino de sua escolha.

Como gravar um rastreamento usando o utilitário de linha de comando TTD.exe

Há três maneiras de registrar um rastreamento.

  • Iniciar um processo
  • Anexar a um processo
  • Monitorar um processo

Depois que o processo estiver sendo registrado, você precisará acionar o problema que deseja depurar. Você pode abrir um arquivo problemático ou clicar em um botão específico no aplicativo para fazer com que o evento de interesse ocorra. Quando o aplicativo que está sendo gravado for encerrado, naturalmente ou por falha, o arquivo de rastreamento será finalizado.

Dica

O registro de rastreamentos TTD requer direitos administrativos. Normalmente, isso é feito executando ttd.exe em um prompt de comando do administrador.

Para obter mais informações sobre como registrar um rastreamento de viagem no tempo usando o WinDbg, consulte Depuração de viagem no tempo – Registrar um rastreamento.

Iniciar um processo

-launch <Program> [<arguments>]

Inicie e rastreie o programa (modo padrão).

Este é o único modo que permite passar argumentos para o programa. O programa será iniciado com os mesmos privilégios que TTD.exe (como administrador). Use -attach ou -monitor para gravar o programa com seu conjunto normal de privilégios.

A inclusão -launch é opcional, mas pode ser usada para maior clareza.

O primeiro argumento não reconhecido que não começa com - ou / será considerado um caminho executável para iniciar e quaisquer argumentos subsequentes serão considerados os argumentos desse programa.

Por exemplo, use TTD.exe notepad.exe para iniciar e gravar o bloco de notas. O rastreamento será interrompido quando você fechar o bloco de notas.

Para obter um exemplo de uso, consulte Exemplos de uso de cenário – gravando um processo.

Anexar a um processo

-attach <PID>

Anexe a um processo em execução especificado pela ID do processo. Use o TaskManager ou o utilitário TaskList para identificar números de processo. Para obter mais informações, consulte Localizando a ID do processo.

Por exemplo, use TTD.exe -attach 21440 -out C:\traces\MyTraceFile.run para iniciar e registrar o processo com uma ID de 21440 e salvar o rastreamento em MyTraceFile.run.

Verifique se o diretório existe (C:\traces neste exemplo) antes de executar TTD.exe.

Para obter um exemplo de uso, consulte Cenário – Localizar e anexar a um processo em execução.

Monitorar um processo

-monitor <Program>

A opção de monitor permite que um programa seja monitorado e rastreado cada vez que for iniciado. Para usar essa opção, você deve especificar um caminho completo para o local de saída com -out.

Para interromper o monitoramento, pressione Ctrl+C.

Os principais benefícios do monitoramento em comparação com os outros métodos são:

  • Você pode iniciar o aplicativo de destino da maneira normal, sem necessidade de descobrir a linha de comando para iniciá-lo.
  • O aplicativo de destino será executado com seus privilégios normais. Se você iniciar o aplicativo diretamente do ttd.exe ele será iniciado com privilégios elevados e isso poderá alterar o comportamento do programa.
  • É útil para automação (use um script que monitora a inicialização de um programa e coleta um rastreamento).

A opção -monitor pode ser especificada mais de uma vez para monitorar vários programas.

Para obter um exemplo de uso, consulte Exemplos de uso do cenário – processos de monitoramento.

Opções de linha de comando

Sintaxe

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

-? | -help

Exiba a ajuda da linha de comando.

Modos

-launch <Program> [<arguments>]

Inicie e rastreie o programa (modo padrão).

Este é o único modo que permite passar argumentos para o programa. A -launch opção deve ser a última opção TTD na linha de comando, seguida pelo programa a ser iniciado e quaisquer argumentos que o programa exija. Se nenhum modo for especificado, ele também será tratado como lançamento. Por exemplo, TTD.exe -out C:\traces ping.exe msn.com é tratado como um lançamento.

-attach <PID>

Anexe a um processo em execução especificado pela ID do processo. Use o utilitário TaskManager ou TaskList para identificar IDs de processo. Para obter mais informações, consulte Localizando a ID do processo.

-monitor <Program>

Rastreie programas ou serviços sempre que forem iniciados (até a reinicialização). Para usar essa opção, você deve especificar um caminho completo para o local de saída com -out.

Opções básicas de linha de comando

-out <path>

Especifique um nome de arquivo de rastreamento ou um diretório. Se for um diretório, o diretório já deve existir. Se for um nome de arquivo, o nome do arquivo não deve existir.

-noUI

Desativa a interface do usuário para controle manual da gravação.

Se esta opção não estiver selecionada, uma pequena interface do usuário será exibida quando a gravação estiver ativa. "Tracing Off" interrompe o rastreamento e o aplicativo continua; "Sair do aplicativo" fecha o aplicativo, o que também interrompe o rastreamento.

Captura de tela da pequena interface do usuário TTD de dois botões exibindo o status de rastreamento e um botão Sair do aplicativo.

-accepteula

Use esta opção para aceitar o contrato de licença de usuário do EULA. Essa opção pode ser usada em cenários de automação, depois que o EULA tiver sido revisado e aceito.

O TTD exibe o EULA na primeira vez que é executado. Digite Y ou N para aceitar o EULA. Uma vez aceito, o ELA não será mais exibido na inicialização. Se o EULA não for aceito, o TTD será encerrado e o EULA será exibido na próxima vez que o TTD for executado.

Controle de rastreamento

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

Pare de rastrear o nome do processo especificado, PID ou "todos" pode ser especificado.

-wait <timeout>

Aguarde até a quantidade de segundos especificada para que todas as sessões de rastreamento no sistema sejam encerradas. Especifique -1 para aguardar infinitamente.

-tracingOff

Inicia o aplicativo com a gravação de rastreamento desativada. Você pode usar a caixa de seleção da interface do usuário para ativar o rastreamento novamente depois que ele for desativado.

Opções adicionais de linha de comando

-children

Registre o destino, bem como todos os processos criados pelo destino. Cada processo filho será registrado em seu próprio arquivo de rastreamento.

-cmdLineFilter "<string>"

Registre o destino se sua linha de comando contiver a cadeia de caracteres. Esta opção funciona apenas com -monitor o modo. É útil para situações em que o argumento da linha de comando identifica exclusivamente o processo no qual você está interessado. Por exemplo, -monitor notepad.exe -cmdLineFilter "specialfile.txt" os registros notepad.exe somente se specialfile.txt aparecer na linha de comando.

-cleanup

Desinstale o driver do monitor de processo.

Configurações de comportamento de rastreamento

-timestampFilename

Adiciona um carimbo de data/hora à última parte do nome do arquivo de rastreamento. Por exemplo, ping_2023-06-17_103116.run.

Por exemplo, para gravar ping.exe, com um carimbo de data/hora incluído no nome do arquivo, use este comando.

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

Por padrão, uma varredura seqüencial é feita para localizar um arquivo não utilizado no diretório de saída. Se ping.exe for gravado, o gravador tentará ping01.run, ping02.run, etc. até que um nome de arquivo não utilizado seja encontrado. Para a maioria dos cenários, esse método de nomenclatura é suficiente. No entanto, se você quiser gravar o mesmo programa muitas vezes, o algoritmo de nomenclatura de arquivos padrão pode se tornar ineficiente, quando houver um grande número de arquivos existentes.

-ring

Rastreie para um buffer de anel. O tamanho do arquivo não aumentará além dos limites especificados pelo -maxFile. Apenas a última parte da gravação que se encaixa no tamanho determinado será salva.

-maxFile <size>

Tamanho máximo do arquivo de rastreamento em MB. Quando no modo de rastreamento completo, o padrão é 1024 GB e o valor mínimo é 1 MB. Quando no modo de buffer de anel, o padrão é 2048 MB, o valor mínimo é 1 MB e o valor máximo é 32768 MB.

O padrão para anel na memória em processos de 32 bits é 256 MB.

-maxConcurrentRecordings <count>

Número máximo de gravações que podem estar em andamento a qualquer momento. Se não for especificado, um número ilimitado de gravações pode ocorrer simultaneamente.

-numVCpu <number>

Especifica um número de CPUs virtuais a serem reservadas e usadas durante o rastreamento. Esse valor afeta a sobrecarga total de memória colocada na memória do processo convidado pelo TTD. Se não for especificado, o padrão por plataforma será: 55 para x64/ARM64 e 32 para x86.

Altere essa configuração para limitar o impacto na memória somente se você estiver ficando sem memória. Alterar o valor numVCpu para um número menor pode afetar gravemente o desempenho do rastreamento e só deve ser feito para contornar problemas de uso de memória.

Se TTD.exe falhar na gravação ou o arquivo .out indicar uma simulação de 0 segundos, o uso -numVCpu poderá permitir que a gravação seja bem-sucedida.

-replayCpuSupport <support>

Especifica qual suporte é esperado das CPUs que serão usadas para reproduzir o rastreamento. A configuração padrão é recomendada para portabilidade de rastreamentos entre máquinas, mas outras opções podem ser usadas para produzir pequenos arquivos de rastreamentos e gravar mais rapidamente (dependendo das instruções específicas usadas pelo programa de destino).

Valores <support>

Valor Descrição
Default Suporte padrão à CPU, requer apenas suporte básico comumente disponível na CPU de replay.
MostConservative Não requer suporte especial na CPU de replay. Adequado para rastreamentos que serão reproduzidos em uma arquitetura de CPU completamente diferente, como um rastreamento Intel na CPU ARM64.
MostAggressive Pressupõe que a CPU de repetição será semelhante e de capacidade igual ou maior do que a CPU usada para gravar.
IntelAvxRequired Pressupõe que a CPU de repetição será uma CPU Intel/AMD de 64 bits com suporte a AVX.
IntelAvx2Required Pressupõe que a CPU de repetição será uma CPU Intel/AMD de 64 bits com suporte para AVX2.

Reduzindo a sobrecarga de rastreamento

Embora o TTD seja muito eficiente para o que faz (rastreamento completo do nível de instrução codificado em menos de um byte/instrução em média), ele ainda tem uma sobrecarga perceptível durante a gravação. As CPUs modernas podem executar bilhões de instruções por segundo, tornando caro até mesmo um byte/instrução. Em muitos casos, não é necessário registrar todo o processo.

As seguintes opções podem ser usadas para reduzir a sobrecarga do rastreamento:

-module <module name>

Registre apenas o módulo especificado (como comdlg32.dll) e o código que ele chama. Pode ser o próprio executável ou qualquer DLL carregada pelo executável. Essa opção pode ser especificada mais de uma vez para gravar vários módulos.

Quando essa opção é usada, o processo de destino é executado em velocidade máxima até que o código no(s) módulo(s) especificado(s) seja executado. O TTD gravará o processo até que a execução saia do(s) módulo(s) especificado(s), momento em que a gravação é desativada e o destino retorna à velocidade máxima. Como ativar/desativar a gravação é caro, o TTD deixará a gravação ativada quando um módulo especificado chamar outros módulos no processo.

-recordmode <Automatic | Manual>

Normalmente, a gravação começa assim que o TTD se injeta no processo de destino (modo "Automático", o padrão). Se o seu programa usa a API de gravação em processo do TTD para controlar quando a gravação ocorre, você pode usar o modo "Manual" para ser executado em velocidade máxima até que seu programa chame a API para iniciar a gravação.

O uso dessas opções pode resultar em uma redução significativa na sobrecarga de gravação e no tamanho do arquivo de rastreamento. A depuração de um rastreamento registrado com essas opções não é diferente de um rastreamento de todo o processo. Sempre que você chegar a um local no rastreamento em que a gravação está desativada, a próxima instrução no rastreamento é a primeira instrução executada quando a gravação é retomada.

-passThroughExit

Passe o valor de saída do processo convidado como o valor de saída do TTD.exe. Esse valor está disponível para arquivos em lote por meio da %ERRORLEVEL% variável. O Powershell e outros ambientes de linha de comando também oferecem mecanismos para obter o valor de saída do processo.

-onInitCompleteEvent <eventName>

Permite que um evento seja sinalizado quando a inicialização do rastreamento for concluída.

Exemplos de uso de cenário - gravando um processo

Cenário – Iniciar e gravar um aplicativo do Windows

Nesse cenário, o bloco de notas é iniciado e um rastreamento é criado.

  1. Use a opção de iniciar o -launch bloco de notas e gravá-lo.
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. Um pequeno menu de aplicativo é exibido mostrando que o rastreamento está ativado.

Captura de tela da interface do usuário do TTD exibindo o status de rastreamento e um botão Sair do aplicativo.

  1. Quando o aplicativo é fechado, um arquivo de rastreamento é gerado. Neste exemplo, notepad01.run.

Cenário – Iniciar e gravar um aplicativo do Windows com um parâmetro passado

Nesse cenário, o ping é iniciado e o endereço para ping é passado como um parâmetro.

  1. Neste exemplo, a -launch opção é omitida, pois esse é o modo padrão.
C:\TTD> TTD.exe ping.exe msn.com
Launching 'ping.exe msn.com'
    Recording process (PID:24044) on trace file: C:\TTD\ping01.run

Pinging msn.com [204.79.197.219] with 32 bytes of data:
Reply from 204.79.197.219: bytes=32 time=22ms TTL=118
Reply from 204.79.197.219: bytes=32 time=21ms TTL=118
Reply from 204.79.197.219: bytes=32 time=25ms TTL=118
Reply from 204.79.197.219: bytes=32 time=21ms TTL=118

Ping statistics for 204.79.197.219:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 21ms, Maximum = 25ms, Average = 22ms
ping.exe(x64) (PID:24044): Process exited with exit code 0 after 3390ms
  Full trace dumped to C:\TTD\ping01.run
  1. Quando o aplicativo é fechado, um arquivo de rastreamento é gerado. Neste exemplo, ping01.run.

Cenário - Localizar e anexar a um processo em execução

Nesse cenário, o bloco de notas é iniciado, sua ID de processo é localizada e um rastreamento é criado anexando-se ao aplicativo em execução

  1. Inicie o aplicativo de destino, neste bloco de notas de exemplo.

  2. Use TaskList ou outros métodos descritos em para localizar a ID do processo. Para obter mais informações, consulte Localizando a ID do processo.

C:\TTD> TaskList
...
Notepad.exe                  21440 Console                    1     73,020 K
...
  1. Usando essa ID de processo, use a -attach opção para anexá-la e registrá-la. Opcionalmente, especifique um nome de arquivo para o arquivo de rastreamento 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

Cenário - Gravando um pai e seus filhos

Nesse cenário, um pai e seus processos filhos serão registrados. Como alguns aplicativos podem usar muitos processos filhos, o arquivo de rastreamento familiar que contém os filhos pode se tornar muito grande.

  1. Especifique a -children opção e o nome do aplicativo pai a ser gravado.

Este é um exemplo de gravação cmd.exe inicialização de ping.exe como um processo filho.

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. Vários arquivos de rastreamento são criados: um para o processo pai e um arquivo de rastreamento para cada processo filho. O WinDbg abre apenas um arquivo de rastreamento por vez, portanto, você precisará executar instâncias separadas do WinDbg para cada rastreamento, se quiser depurá-las ao mesmo tempo.

Exemplos de uso de cenários - processos de monitoramento

Cenário - monitoramento de lançamentos de programas e início de gravação

Nesse cenário, a -monitor opção é usada para registrar todas as instâncias em execução no momento, bem como instâncias futuras do notepad.exe, até que o sistema seja reinicializado ou ttd.exe seja encerrado via Ctrl+C. A -out opção é necessária para monitor e a pasta de saída já deve existir.

  1. Monitore e rastreie as instâncias atuais, bem como quaisquer instâncias futuras 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. Neste exemplo, duas instâncias de notepad.exe foram carregadas após o início do rastreamento. Depois que a atividade de interesse foi capturada, CTRL-C foi usado no prompt de comando para interromper a gravação.

Cenário - monitoramento de dois programas para lançamentos de programas

Nesse cenário, a -monitor opção é usada para monitorar e registrar dois aplicativos.

  1. Monitore e rastreie a atual, bem como quaisquer instâncias futuras de notepad.exe e ping.exe.
C:\TTD> TTD.exe -out C:\TTD\ -monitor notepad.exe -monitor ping.exe
Microsoft (R) TTD 1.01.11
Release: 1.11.121.0
Copyright (C) Microsoft Corporation. All rights reserved.


Successfully uninstalled the Process Launch Monitor driver
Successfully installed the Process Launch Monitor driver
Recording process Notepad.exe(17972)        From parent process explorer.exe(8440)
    Recording process (PID:17972) on trace file: C:\TTD\Notepad01.run
Tracking process svchost.exe(7824)        From parent process services.exe(1292)
Tracking process sppsvc.exe(10376)        From parent process services.exe(1292)
Tracking process ClipUp.exe(15108)        From parent process svchost.exe(7824)
Tracking process ClipUp.exe(21180)        From parent process ClipUp.exe(15108)
Tracking process consent.exe(24280)        From parent process svchost.exe(892)
Tracking process ctfmon.exe(24508)        From parent process svchost.exe(5064)
Tracking process wt.exe(10768)        From parent process explorer.exe(8440)
Tracking process WindowsTerminal.exe(23296)        From parent process wt.exe(10768)
Tracking process OpenConsole.exe(6816)        From parent process WindowsTerminal.exe(23296)
Tracking process powershell.exe(15956)        From parent process WindowsTerminal.exe(23296)
Tracking process git.exe(3656)        From parent process powershell.exe(15956)
Tracking process git.exe(1928)        From parent process git.exe(3656)
Tracking process git.exe(20312)        From parent process powershell.exe(15956)
Tracking process git.exe(5712)        From parent process git.exe(20312)
Tracking process csc.exe(16144)        From parent process powershell.exe(15956)
Tracking process cvtres.exe(19488)        From parent process csc.exe(16144)
Recording process PING.EXE(21468)        From parent process powershell.exe(15956)
    Recording process (PID:21468) on trace file: C:\TTD\PING01.run
(x64) (PID:21468): Process exited with exit code 1 after 234ms
  Full trace dumped to C:\TTD\PING01.run


Tracking process Teams.exe(10060)        From parent process Teams.exe(2404)
Tracking process cmd.exe(21796)        From parent process powershell.exe(15956)
Recording process PING.EXE(364)        From parent process cmd.exe(21796)
    Recording process (PID:364) on trace file: C:\TTD\PING02.run
(x64) (PID:364): Process exited with exit code 1 after 234ms
  Full trace dumped to C:\TTD\PING02.run
  1. Neste exemplo, notepad.exe e ping.exe foram carregados após o início do rastreamento. Depois que a atividade de interesse foi capturada, CTRL-C foi usado no prompt de comando para interromper a gravação.

Cenário - Parando a gravação em uma segunda janela

Nesse cenário, a atividade de interesse foi capturada e todas as gravações são interrompidas usando -stop all. Uma segunda janela de comando é usada para executar a -stop all opção.

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'

Cenário - Limpando o driver do monitor

Nesse cenário, a -cleanup opção é usada para limpar o driver do monitor após a conclusão de toda a gravação.

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

Exemplos adicionais de linha de comando

Esta tabela destaca alguns exemplos adicionais de uso de linha de comando. Consulte as Opções de linha de comando para obter informações adicionais sobre as opções ilustradas.

Cenário Comando Descrição
Anexar ao processo, mas ainda não iniciar a gravação Ttd.exe -tracingoff notepad.exe Inicia o bloco de notas com a gravação desligada. A gravação pode ser iniciada a qualquer momento por meio da interface do usuário.
Filtrar por linha de comando Ttd.exe -cmdlinefilter foo.txt -monitor notepad.exe Registre notepad.exe mas somente se foo.txt estiver na linha de comando quando for iniciado, colocando a saída no diretório atual.
Gravação de toque Ttd.exe -ring -attach 1234 Registra o PID 1234 em um arquivo de rastreamento limitado a 2 GB, colocando a saída no diretório atual. O conteúdo mais antigo no arquivo de rastreamento é substituído conforme necessário para manter o arquivo abaixo do tamanho máximo.

Use -maxfile para alterar o tamanho máximo.
Limitar o tamanho do arquivo de rastreamento Ttd.exe -maxfile 4096 notepad.exe Grave notepad.exe até que o arquivo de rastreamento atinja 4 GB, colocando a saída no diretório atual.
Limite o número de gravações que acontecem ao mesmo tempo Ttd.exe -maxconcurrentrecordings 1 -out c:\my\dir -monitor notepad.exe A gravação consome muita CPU e, em alguns casos.
Reduzir o uso de memória no processo de destino Ttd.exe -numvcpu 8 -monitor w3wp.exe Alguns processos, como o w3wp.exe, definem uma pequena cota na quantidade de memória que ele pode usar. Se ttd.exe não iniciar a gravação, use -numvcpu para reduzir o número de CPUs virtuais alocadas por TTD. Tente esta opção apenas se ttd.exe não conseguir gravar por outros meios.
Escolha entre portabilidade de rastreamento e velocidade de gravação / tamanho do arquivo de rastreamento Ttd.exe -replaycpusupport mostaggressive notepad.exe Por padrão, o TTD produz arquivos de rastreamento que são portáteis em uma ampla variedade de hardware. Escolher 'mostaggressive' informa ao TTD que não há problema em gravar um rastreamento que só pode ser reproduzido em CPUs com os mesmos recursos da máquina que registrou o rastreamento. Em alguns casos, isso pode melhorar substancialmente a velocidade de gravação e o tamanho do arquivo de rastreamento.

Exemplos de linha de comando de automação

Esta tabela destaca alguns exemplos adicionais de uso de linha de comando que podem ser úteis para o uso automatizado de TTD.exe utilitário.

Cenário Comando Descrição
Desativar interface do usuário Ttd.exe -noui -accepteula notepad.exe Grave notepad.exe, colocando a saída no diretório atual, sem mostrar a interface do usuário.
Aguarde até que o gravador inicie programaticamente Ttd.exe -accepteula -oninitcompleteevent ttd_notepad notepad.exe Crie um evento nomeado Win32 'ttd_notepad' e inicie notepad.exe. O TTD sinalizará 'ttd_notepad' quando a gravação for inicializada. A automação pode aguardar o evento antes de prosseguir com o comportamento que deseja registrar.
Preservar o código de saída do destino Ttd.exe -accepteula -passthroughexit ping.exe msn.com Registra ping.exe, colocando a saída no diretório atual. O código de saída do Ttd.exe será o mesmo que o código de saída do ping.exe.
Aguarde o término da gravação Ttd.exe -accepteula -wait 30 Depois que a gravação for interrompida, aguarde até 30 segundos para que o TTD termine de gravar o arquivo de rastreamento no disco. Use -wait -1 para esperar indefinidamente.

Todos esses exemplos usam a -accepteula opção para garantir que a automação não seja bloqueada pela caixa de diálogo de confirmação do EULA.

Trabalhando com o arquivo de rastreamento gerado

Para obter informações sobre como trabalhar com um rastreamento e instruções sobre como reproduzir rastreamentos de viagem no tempo e navegar para frente e para trás no tempo, consulte Depuração de viagem no tempo – Repetir um rastreamento.

Dicas sobre como trabalhar com arquivos de rastreamento

  • Ao compartilhar rastreamentos com outras pessoas, você só precisa compartilhar o arquivo .run. O arquivo de índice (.idx) pode ser tão grande quanto o arquivo .run e é criado automaticamente quando o arquivo de rastreamento é carregado pelo WinDbg.
  • Ao colaborar com outras pessoas, transmita as posições de rastreamento relevantes relacionadas ao problema em questão. O colaborador pode usar o comando !tt x:y para mover a esse ponto exato no tempo na execução do código. Os intervalos de posição de tempo podem ser incluídos nas descrições de bugs para rastrear o local em que o possível problema pode estar ocorrendo.
  • Ao relatar um problema com o TTD, se você fornecer o arquivo .run, forneça o arquivo .out também. Isso permite a confirmação de que o processo de gravação funcionou corretamente.
  • Os arquivos de rastreamento (.run) são bem compactados.

Solução de problemas TTD.exe

Há alguns casos em que podem ocorrer erros de arquivo de rastreamento. Para obter mais informações, consulte Depuração de viagem no tempo – Solução de problemas.

O arquivo .out pode ser usado para solução de problemas. O arquivo de saída de exemplo mostra um rastreamento funcional, terminando com um código de saída 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)

A maior parte do conteúdo do arquivo .out é usada internamente pela equipe de depuração de viagem no tempo para solucionar erros de gravação. As informações a seguir podem ser úteis para outras pessoas que estão trabalhando com o arquivo de rastreamento.

  • Algumas mensagens de erro são exibidas apenas no arquivo .out e podem ser usadas para determinar as especificidades da falha.
  • Indicação da hora do relógio de parede em que a gravação começou / parou
  • Quanto tempo durou a sessão de gravação (tempo de simulação)
  • Se a gravação é uma gravação de inicialização (com linha de comando) ou anexar gravação
  • A versão do sistema operacional

Confira também

Depuração de viagem no tempo – Visão geral

Depuração de viagem no tempo - Registrar um rastreamento

Depuração de viagem no tempo - Repetir rastreamento