Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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.
As gravações TTD podem conter informações pessoalmente identificáveis ou relacionadas à segurança
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:
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.
Configurações relacionadas a eventos
-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:
- Iniciar e gravar - Comece com um exemplo simples do Bloco de Notas.
- Iniciar com parâmetros - Passe argumentos para o seu aplicativo.
- Anexar ao processo em execução - Grave um aplicativo já em execução.
- Registrar pais e filhos - Capture cenários de vários processos.
Cenário - Iniciar e gravar um aplicativo do Windows
Nesse cenário, você inicia o bloco de notas e cria um rastreamento.
- Use a opção
-launchpara 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
- Um pequeno menu do aplicativo é exibido, mostrando que o rastreamento está ativado.
- 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.
- Neste exemplo, você omite a
-launchopçã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
- 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.
Inicie o aplicativo de destino, neste exemplo, o Bloco de Notas.
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
...
- Utilize o ID do processo com a opção
-attachpara 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.
- Especifique a opção
-childrene 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
...
- 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.
- 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
- 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.
- 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
- 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:ypara 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
Conteúdo relacionado
- Introdução: Depuração com Viagem no Tempo: Visão Geral - Aprenda os fundamentos da DVT.
- Gravação com WinDbg: Depuração com Viagem no Tempo - Gravar um rastreamento - Use a interface de utilizador do WinDbg para gravar rastreamentos.
- Analisando rastreamentos: Depuração de viagem no tempo - Reproduzir um rastreamento - Depurar seus rastreamentos gravados no WinDbg.
- Solução de problemas: Depuração com Viagem no Tempo - Solução de problemas - Resolva problemas comuns de gravação.