Partilhar via


Debugging de Viagem no Tempo - ferramenta de linha de comando TTD.exe

Captura de ecrã do logótipo 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 rastreamentos de Time Travel Debugging (TTD). O utilitário de linha de comando TTD.exe permite gravar a execução do aplicativo ou do processo, salvá-lo em um arquivo de rastreamento e reproduzi-lo no WinDbg para diagnosticar problemas de execução de código.

Neste artigo, você aprenderá:

  • Quando usar TTD.exe versus a interface do usuário do WinDbg
  • Como instalar e configurar o TTD.exe
  • Três maneiras de registar rastreamentos (iniciar, anexar, monitorizar)
  • Opções de linha de comando e cenários avançados

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

A Depuração de Viagem no Tempo (TTD) permite gravar a execução de código de uma aplicação ou processo e salvá-la como um ficheiro de rastreamento. Você pode reproduzir o arquivo 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 gravar um aplicativo ou processo é diretamente da interface do usuário do WinDbg. Se você é novo na Depuração de Viagem no Tempo, comece com Depuração de Viagem no Tempo - Visão Geral para aprender o básico usando a interface WinDbg.

Você pode ter cenários em que precisa apenas do gravador de linha de comando TTD: gravação em um PC sem instalar o depurador, cenários avançados de gravação, automação de teste e assim por diante. 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 de gravação

A gravação TTD é uma tecnologia invasiva. Você percebe uma lentidão entre 5x-20x ou mais no aplicativo ou processo em execução durante a gravação, dependendo do aplicativo e das opções de gravação que selecionar.

Os arquivos de rastreamento criados crescem com o tempo e podem ocupar espaço de armazenamento significativo. Procure 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 se anexa a um processo, ele não pode se remover. Feche o aplicativo ou termine o processo assim que a gravação TTD estiver concluída. Para processos críticos do sistema, essa ação requer uma reinicialização do sistema operacional.

Importante

As gravações TTD capturam o conteúdo da memória e podem conter informações pessoalmente identificáveis ou relacionadas à segurança, incluindo, mas não necessariamente limitado a, caminhos de arquivo, registro, memória ou conteúdo de arquivo. A informação exata depende da atividade do processo alvo enquanto foi gravada.

Baixe e instale o utilitário de linha de comando TTD.exe (método preferencial)

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

Selecione Instalar, e o TTD é transferido 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.

Sugestão

Após a instalação, abra um novo prompt de comando e digite ttd.exe -help para verificar se a instalação foi bem-sucedida.

Se tiver dificuldades na instalação, consulte Resolução de problemas de instalação com o ficheiro do App Installer.

Em alguns PCs, poderá ter de instalar o Microsoft App Installer para Windows 10. Está disponível na aplicação Microsoft Store no Windows. O Gestor de Pacotes do Windows é suportado através do App Installer a partir do Windows 10 1809.

Baixe e instale 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 fazê-lo.

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

Se você já instalou o utilitário de linha de comando TTD, você pode extrair os arquivos do local instalado. No PowerShell, executar o seguinte comando para localizar a localização instalada:

(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 é mais ou menos assim (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 precisa gravar processos de 32 bits, você pode excluir essa pasta (e você pode adicionar /xd x86 ao comando robocopy para evitar copiá-lo em primeiro lugar). A versão ARM64 não tem subdiretórios.

O arquivo TTDRecordUI.dll só é necessário se você quiser usar a interface do usuário para controlar a gravação. Se não quiser a interface do utilizador, pode apagar este ficheiro.

Baixe e extraia manualmente o pacote do utilitário de linha de comando TTD.exe

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

  • Obtém a URL da versão atual do TTD de https://aka.ms/ttd/download.
  • Transfere o pacote MSIX.
  • Extrai o MSIX da arquitetura solicitada do pacote MSIX.
  • Extrai 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ê salve o script anterior como Get-Ttd.ps1, execute-o assim para baixar os binários x64 para o diretório c:\myttd:

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

Ou especifique 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.

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

Você pode registrar um rastreamento de três maneiras:

Método Melhor para Cenário de exemplo
Lançamento Iniciar um novo processo com argumentos específicos Gravando uma ferramenta de linha de comando como ping.exe
Anexar Gravar um processo já em execução Depurando um serviço ou aplicação de longa execução
Monitor Gravação automática sempre que um processo é iniciado Captura de problemas intermitentes ou problemas de inicialização

Depois de começar a gravar o processo, acione o problema que deseja depurar. Você pode abrir um arquivo problemático ou selecionar um botão específico no aplicativo para causar o evento de interesse. Quando o aplicativo que você está gravando termina, naturalmente ou falhando, o arquivo de rastreamento é finalizado.

Sugestão

A gravação de vestígios TTD requer direitos administrativos. Normalmente, você executa ttd.exe a partir de um prompt de comando do administrador.

Para obter mais informações sobre como gravar um rastreamento de viagem no tempo usando o 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).

Este modo é o único modo que permite passar argumentos para o programa. O programa é 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.

Incluir -launch é opcional, mas você pode usá-lo para clareza.

O primeiro argumento não reconhecido que não começa com - ou / é assumido como um caminho executável para iniciar, e quaisquer argumentos subsequentes são assumidos como sendo os argumentos para esse programa.

Por exemplo, use TTD.exe notepad.exe para iniciar e gravar o Bloco de Notas. O rastreamento pára quando fecha o Notepad.

Para exemplo de utilização, consulte Exemplos de uso de cenário - registando um processo.

Anexar a um processo

-attach <PID>

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

Por exemplo, use TTD.exe -attach 21440 -out C:\traces\MyTraceFile.run para iniciar e gravar 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.

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

Monitorar um processo

-monitor <Program>

A opção de monitor permite monitorar e rastrear um programa sempre que ele é 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 da monitorização 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 é executado com seus privilégios normais. Se você iniciar o aplicativo diretamente do ttd.exe, ele será iniciado com privilégios elevados e essa alteração poderá afetar o comportamento do programa.
  • É útil para automação (use um script que monitorize o lançamento de um programa e colete um traço).

Você pode especificar a opção -monitor mais de uma vez para monitorar vários programas.

Para exemplos de uso, consulte Exemplos de uso de cenários - processos de monitorização.

Opções da linha de comandos

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 modo é o único modo que permite passar argumentos para o programa. A opção -launch 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 você não especificar um modo, a ferramenta o tratará como uma inicialização. 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 Gerenciador de Tarefas ou o utilitário Lista de Tarefas para identificar IDs de processo. Para obter mais informações, consulte Encontrar o 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 você especificar um diretório, ele já deve existir. Se você especificar um nome de arquivo, o nome do arquivo não deverá existir.

-noUI

Desativa a interface do usuário para controle manual de gravação. Use esta opção para cenários de automação em que você não precisa de controle interativo.

Se você não selecionar essa opção, uma pequena interface do usuário aparecerá quando a gravação estiver ativa:

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

A interface do usuário fornece dois controles:

  • Tracing Off - Interrompe o rastreamento e o aplicativo continua em execução
  • Sair do aplicativo - Fecha o aplicativo e interrompe o rastreamento

-accepteula

Use esta opção para aceitar o contrato de licença de usuário do EULA. Use essa opção em cenários de automação, depois de revisar e aceitar o EULA.

O TTD exibe o EULA na primeira vez que ele é executado. Digite Y ou N para aceitar o EULA. Uma vez aceito, o EULA não aparece mais na inicialização. Se você não aceitar o EULA, o TTD sairá e exibirá o EULA na próxima vez que ele for executado.

Controlo de rastreio

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

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

-wait <timeout>

Aguarde até o número especificado de segundos 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 da interface do usuário para ativar novamente o rastreamento depois que ele for desativado.

Opções de linha de comando adicionais

-children

Registar o processo-alvo e todos os processos criados por ele. Cada processo filho é registado em seu próprio ficheiro de rastreamento.

-cmdLineFilter "<string>"

Registre o processo de destino se sua linha de comando contiver a cadeia de caracteres. Esta opção funciona apenas com o modo -monitor. É útil quando o argumento da linha de comando identifica exclusivamente o processo em que você está interessado. Por exemplo, -monitor notepad.exe -cmdLineFilter "specialfile.txt" regista 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.

Para gravar ping.exe com um carimbo de data/hora no nome do arquivo, use este comando.

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

Por padrão, o gravador verifica sequencialmente o diretório de saída para encontrar um nome de arquivo não utilizado. Se você gravar ping.exe, o gravador tentará ping01.run, ping02.rune assim por diante até encontrar um nome de arquivo não utilizado. 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 nomeação de arquivo padrão pode se tornar ineficiente quando um grande número de arquivos existentes estão presentes.

-ring

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

-maxFile <size>

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

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

-maxConcurrentRecordings <count>

Número máximo de gravações que podem estar em curso em qualquer ponto no tempo. Se você não especificar esse valor, um número ilimitado de gravações pode ocorrer simultaneamente.

-numVCpu <number>

Especifica o 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 você não especificar esse valor, o padrão por plataforma será 55 para x64/ARM64 e 32 para x86.

Altere esta definição para limitar o impacto na memória apenas se estiver a ficar sem memória. A redução do numVCpu valor pode afetar gravemente o desempenho do rastreamento e só deve ser feita para contornar problemas de uso de memória.

Se TTD.exe não conseguir gravar, ou o arquivo .out indicar uma simulação de 0 segundos, usar -numVCpu pode permitir que a gravação seja bem-sucedida.

-replayCpuSupport <support>

Especifica o suporte esperado das CPUs que reproduzem o rastreamento. A configuração padrão é recomendada para a portabilidade de rastreamentos entre máquinas, mas você pode usar outras opções para produzir arquivos de rastreamento menores e gravar mais rapidamente, dependendo das instruções específicas usadas pelo programa de destino.

<support> valores

Valor Descrição
Default Suporte de CPU padrão, apenas requer suporte básico comumente disponível na CPU de replay.
MostConservative Não requer suporte especial na CPU de replay. Adequado para rastreamentos que são reproduzidos em uma arquitetura de CPU completamente diferente, como um rastreamento Intel na CPU ARM64.
MostAggressive Assume que a CPU de reprodução é semelhante e de capacidade igual ou superior à da CPU usada para gravação.
IntelAvxRequired Assume que a CPU de replay é uma CPU Intel/AMD de 64 bits que suporta AVX.
IntelAvx2Required Pressupõe-se que a CPU de replay seja uma CPU Intel/AMD de 64 bits que suporte AVX2.

Redução das despesas gerais de rastreio

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 percetível durante a gravação. CPUs modernas podem executar bilhões de instruções por segundo, tornando até mesmo um byte/instrução caro. Em muitos casos, não é necessário registar 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. Isso pode ser o próprio executável ou qualquer DLL carregada pelo executável. Esta opção pode ser especificada mais de uma vez para gravar vários módulos.

Quando esta opção é usada, o processo de destino é executado a toda velocidade até que o código no(s) módulo(s) especificado(s) seja executado. O TTD gravará o processo até que a execução deixe o(s) módulo(s) especificado(s), momento em que a gravação é desligada e o alvo retorna à velocidade máxima. Como o processo de ligar e desligar a gravação resulta em custos elevados, o TTD deixará a gravação ativada quando um módulo especificado chamar outros módulos durante o processo.

-recordmode <Automatic | Manual>

Normalmente, a gravação começa assim que o TTD se injeta no processo alvo (modo "automático", o padrão). Se o seu programa faz uso da API de gravação em processo do TTD para controlar quando a gravação ocorre, então você pode usar o modo "Manual" para executar 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. Depurar um rastreamento gravado com essas opções não é diferente de um rastreamento de todo o processo. Sempre que você chegar a um local no rastreamento onde 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 processo TTD.exe. Esse valor está disponível para arquivos em lote por meio da variável %ERRORLEVEL%. 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ários - gravando um processo

Escolha um cenário que corresponda às suas necessidades:

Cenário - Iniciar e gravar um aplicativo do Windows

Nesse cenário, você inicia o bloco de notas e cria um rastreamento.

  1. Use a opção -launch para iniciar o 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 do aplicativo é exibido, mostrando que o rastreamento está ativado.

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

  1. Quando você fecha o aplicativo, ele gera um arquivo de rastreamento. Neste exemplo, o arquivo de rastreamento é chamado notepad01.run.

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

Nesse cenário, inicia-se o ping e passa-se o endereço para o ping como um parâmetro.

  1. Neste exemplo, você omite a -launch opção porque é 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 você fecha o aplicativo, ele gera um arquivo de rastreamento. Neste exemplo, o arquivo de rastreamento é chamado ping01.run.

Cenário - Localize e anexe a um processo em execução

Nesse cenário, você inicia o bloco de notas, localizar sua ID de processo e criar um rastreamento anexando ao aplicativo em execução.

  1. Inicie o aplicativo de destino, neste exemplo, o Bloco de Notas.

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

C:\TTD> TaskList
...
Notepad.exe                  21440 Console                    1     73,020 K
...
  1. Utilize o ID do processo com a opção -attach para anexá-lo e gravá-lo. Opcionalmente, especifique um nome de arquivo para o arquivo de rastreamento com -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 - Gravar um processo pai e seus processos filhos

Nesse cenário, você registra um processo pai e seus processos filho. Como alguns aplicativos usam muitos processos filho, o arquivo de rastreamento familiar que contém os filhos pode se tornar bastante grande.

  1. Especifique a opção -children e o nome da aplicação principal a ser registada.

Este exemplo registra a cmd.exe inicialização 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 de cada vez, portanto, você precisa 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 para lançamentos de programas e início da gravação

Nesse cenário, use a -monitor opção para registrar todas as instâncias em execução no momento e instâncias futuras do notepad.exe até que o sistema seja reinicializado ou você saia ttd.exe com Ctrl+C. Você precisa da -out opção para monitor, e a pasta de saída já deve existir.

  1. Monitore e rastreie as instâncias atuais e futuras do 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, você carrega duas instâncias de notepad.exe após o início do rastreamento. Quando você capturar a atividade de interesse, use CTRL-C no prompt de comando para parar a gravação.

Cenário - monitorização de dois programas para lançamento de programas

Nesse cenário, use a -monitor opção para monitorar e gravar dois aplicativos.

  1. Monitore e rastreie as instâncias atuais e 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, você carrega notepad.exe e, em seguida, ping.exe após o início do rastreamento. Quando você capturar a atividade de interesse, use CTRL-C no prompt de comando para parar a gravação.

Dicas para trabalhar com arquivos de rastreamento

  • Ao compartilhar rastreamentos com outras pessoas, compartilhe apenas o arquivo .run. O arquivo de índice (.idx) pode ser tão grande quanto o arquivo .run e é criado automaticamente quando o WinDbg carrega o arquivo de rastreamento.
  • Ao colaborar com outras pessoas, partilhe quaisquer posições de rastreio relevantes relacionadas com o problema. O colaborador pode usar o comando !tt x:y para se mover para esse ponto exato no tempo na execução do código. Você pode incluir intervalos de posição de tempo em descrições de bugs para rastrear onde o possível problema ocorre.
  • Ao relatar um problema com o TTD, se você fornecer o arquivo .run, forneça o arquivo .out também. Esta adição permite a confirmação de que o processo de gravação funcionou corretamente.
  • Os arquivos de rastreamento (.run) compactam bem.

Resolução de problemas de gravação do TTD.exe

Erros de arquivo de rastreamento podem ocorrer. Para obter mais informações, consulte Depuração de viagem no tempo - Solução de problemas.

Você pode usar o arquivo .out para solucionar problemas. O arquivo de saída de exemplo mostra um rastreamento funcional, terminando com um código de saída de 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 ajudá-lo a determinar as especificidades da falha.
  • Indicação da hora do relógio de parede em que a gravação começou e parou
  • Quanto tempo durou a sessão de gravação (tempo de simulação)
  • Se a gravação é um lançamento (com linha de comando) ou anexar gravação
  • A versão do SO