Compartilhar via


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

Logotipo de depuração de 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 TTD (Depuração de Viagem no Tempo) 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 computador 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 de TTD afeta o processo gravado

A gravação de TTD é uma tecnologia invasiva. Você observará qualquer lugar entre 5x e 20x ou mais de 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 ao longo do tempo e podem ocupar espaço de armazenamento significativo. Trabalhe para rastrear pelo período mais curto de tempo, capturando a atividade de programa de interesse e, em seguida, feche o rastreamento o mais rápido possível.

Depois que o TTD é anexado a um processo, ele não pode ser removido dele. Feche o aplicativo ou encerre o processo depois que a gravação TTD for 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 relacionadas à segurança ou à identificação pessoal, incluindo, mas não necessariamente, os caminhos de arquivo, o registro, a memória ou o conteúdo do arquivo. As informações exatas dependem da atividade do processo de destino enquanto ela foi registrada.

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 baixará e instalará. O comando TTD é adicionado ao caminho do sistema e está disponível para uso no prompt de comando, quando a instalação é concluída.

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

Em alguns computadores, talvez seja necessário instalar o Instalador de Aplicativo da Microsoft para Windows 10. Ele está disponível no aplicativo da Microsoft Store no Windows. Gerenciador de Pacotes do Windows tem suporte por meio do 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 preferencial seja usar o Instalador de Aplicativo, você também pode baixar o pacote de linha de comando TTD e extrair os arquivos manualmente. Aqui estão duas maneiras de fazê-lo.

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

Se você já tiver instalado o utilitário de linha de comando TTD, poderá extrair os arquivos do local instalado. No Powershell, você faria isso para localizar 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 um computador 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 registrar processos de 32 bits, essa pasta poderá ser excluída (e você poderá adicionar /xd x86 ao comando robocopy para evitar copiá-la em primeiro lugar). A versão ARM64 não tem nenhum subdiretório.

O TTDRecordUI.dll só será 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 do utilitário 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 será:

  • Obtenha a URL para a versão atual do TTD de 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 registrar 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á disparar 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 registrado terminar, naturalmente ou falhando, o arquivo de rastreamento será finalizado.

Dica

A gravação 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 gravar um rastreamento de viagem no tempo usando WinDbg, consulte Depuração de Viagem no Tempo – Gravar um rastreamento.

Iniciar um processo

-launch <Program> [<arguments>]

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

Esse é 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 registrar 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 inicialização, e quaisquer argumentos subsequentes serão considerados os argumentos para esse 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.

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

Anexar a um processo

-attach <PID>

Anexar a um processo em execução especificado pela ID do processo. Use 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 e a 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.

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

Monitorar um processo

-monitor <Program>

A opção monitor permite que um programa seja monitorado e rastreado sempre 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 main 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.
  • Ele é útil para automação (use um script que monitora o lançamento de um programa e coleta um rastreamento).

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

Por exemplo, uso, consulte Exemplos de uso de cenário – processos de monitoramento.

Opções de linha de comando

Syntax

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).

Esse é o único modo que permite que você passe 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 todos os argumentos necessários para o programa. Se nenhum modo for especificado, ele também será tratado como inicialização. Por exemplo TTD.exe -out C:\traces ping.exe msn.com , é tratado como uma inicialização.

-attach <PID>

Anexar 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>

Rastrear 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 um diretório, o diretório já deverá existir. Se um nome de arquivo, o nome do arquivo não deverá existir.

-noUI

Desabilita a interface do usuário para controle manual de gravação.

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

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

-accepteula

Use essa 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 for revisado e aceito.

O TTD exibe o EULA na primeira vez em que é executado. Digite Y ou N para aceitar o EULA. Depois de aceita, a ELA não será mais exibida 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, o 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 terminem. Especifique -1 para aguardar infinitamente.

-tracingOff

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

Opções de linha de comando adicionais

-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. Essa opção funciona apenas com -monitor o modo . É útil para situações em que o argumento de linha de comando identifica exclusivamente o processo em que 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

Desinstalar o driver do monitor do 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 registrar 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 verificação sequencial é 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 arquivo padrão poderá se tornar ineficiente, quando houver um grande número de arquivos existentes.

-ring

Rastrear até um buffer de anéis. O tamanho do arquivo não aumentará além dos limites especificados por -maxFile. Somente a última parte da gravação que se ajusta ao tamanho especificado será salva.

-maxFile <size>

Tamanho máximo do arquivo de rastreamento em MB. Quando estiver 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 poderá ocorrer simultaneamente.

-numVCpu <number>

Especifica uma série 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 por 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 severamente o desempenho do rastreamento e só deve ser feito para contornar problemas de uso de memória.

Se TTD.exe falhar ao gravar 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 computadores, mas outras opções podem ser usadas para produzir arquivos de rastreamento pequenos e registrar mais rapidamente (dependendo das instruções específicas usadas pelo programa de destino).

Valores <support>

Valor Descrição
Default O suporte à CPU padrão requer apenas suporte básico comumente disponível na CPU de reprodução.
MostConservative Não requer suporte especial na CPU de reprodução. 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 reprodução será semelhante e de capacidade igual ou maior do que a CPU usada para registrar.
IntelAvxRequired Pressupõe que a CPU de reprodução será a CPU intel/AMD de 64 bits que dá suporte ao AVX.
IntelAvx2Required Pressupõe que a CPU de reprodução será a CPU intel/AMD de 64 bits que dá suporte ao AVX2.

Reduzindo a sobrecarga de rastreamento

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

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

-module <module name>

Registre apenas o módulo especificado (por exemplo, comdlg32.dll) e o código que ele chama. Isso pode ser o executável em si ou qualquer DLL carregada pelo executável. Essa opção pode ser especificada mais de uma vez para registrar vários módulos.

Quando essa opção é usada, o processo de destino é executado a toda velocidade até que o código nos módulos especificados seja executado. Em seguida, o TTD gravará o processo até que a execução deixe os módulos especificados, quando a gravação do ponto é desativada e o destino retorna a toda velocidade. 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 é iniciada assim que o TTD se injeta no processo de destino (modo "Automático", o padrão). Se o programa usar a API de gravação em processo do TTD para controlar quando a gravação ocorrer, você poderá usar o modo "Manual" para ser executado a toda velocidade até que o 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ê chega 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 de rastreamento for concluída.

Exemplos de uso de cenário – gravação de um processo

Cenário – Iniciar e gravar um aplicativo do Windows

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

  1. Use a opção para 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 menu de aplicativo pequeno é exibido mostrando que o rastreamento está ativado.

Captura de tela da interface do usuário do TTD exibindo 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 opção -launch é 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

Neste cenário, o bloco de notas é iniciado, sua ID de processo está 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 opção -attach 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 – Gravação de um pai e seus processos filhos

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

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

Este é um exemplo de gravação cmd.exe iniciando 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 só abre 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ário – processos de monitoramento

Cenário – monitoramento de inicializações de programas e início da gravação

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

  1. Monitore e rastreie o atual, 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 usada no prompt de comando para interromper a gravação.

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

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

  1. Monitore e rastreie o 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, em seguida, ping.exe foram carregados após o início do rastreamento. Depois que a atividade de interesse foi capturada, CTRL-C, foi usada no prompt de comando para interromper a gravação.

Cenário – Interrompendo a gravação em uma segunda janela

Nesse cenário, a atividade de interesse foi capturada e toda a gravação é interrompida usando -stop all. Uma segunda janela de comando é usada para executar a opção -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'

Cenário – Limpar o driver do monitor

Nesse cenário, a opção -cleanup é usada para limpo 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 de linha de comando adicionais

Esta tabela realça 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 desativada. 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 anel 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. Conteúdos mais antigos no arquivo de rastreamento são substituídos conforme necessário para manter o arquivo sob o tamanho máximo.

Use -maxfile para alterar o tamanho máximo.
Limitar o tamanho do arquivo de rastreamento Ttd.exe -maxfile 4096 notepad.exe Registre notepad.exe até que o arquivo de rastreamento atinja 4 GB, colocando a saída no diretório atual.
Limitar o número de gravações que ocorrem ao mesmo tempo Ttd.exe -maxconcurrentrecordings 1 -out c:\my\dir -monitor notepad.exe A gravação é intensiva em 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 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 alocações de TTD de CPUs virtuais. Tente essa opção somente se ttd.exe não puder 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 portáteis em uma ampla gama 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 que o computador 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 realça alguns exemplos de uso de linha de comando adicionais que podem ser úteis para o uso automatizado de TTD.exe utilitário.

Cenário Comando Descrição
Desabilitar interface do usuário Ttd.exe -noui -accepteula notepad.exe Registre notepad.exe, colocando a saída no diretório atual, sem mostrar a interface do usuário.
Aguarde até que o gravador seja iniciado programaticamente Ttd.exe -accepteula -oninitcompleteevent ttd_notepad notepad.exe Crie um evento Win32 chamado '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 até que a gravação termine Ttd.exe -accepteula -wait 30 Depois que a gravação for interrompida, aguarde até 30 segundos para que o TTD conclua a gravação do arquivo de rastreamento em disco. Use -wait -1 para aguardar indefinidamente.

Todos esses exemplos usam a opção -accepteula 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 – Reproduzir 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, passe todas as posições de rastreamento relevantes relacionadas ao problema em questão. O colaborador pode usar o !tt x:y comando para mover para esse ponto exato no tempo na execução do código. Intervalos de posição de tempo podem ser incluídos em descrições de bugs para acompanhar onde 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.
  • Arquivos de rastreamento (.run) compactam bem.

Solução de problemas TTD.exe

Há alguns casos em que erros de arquivo de rastreamento podem ocorrer. 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 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 problemas de 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 foi iniciada/interrompida
  • Quanto tempo a sessão de gravação durou (tempo de simulação)
  • Se a gravação é uma inicialização (com linha de comando) ou gravação de anexação
  • A versão do sistema operacional

Consulte 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 – reproduzir um rastreamento