다음을 통해 공유


시간 이동 디버깅 - 명령줄 유틸리티 TTD.exe

시계가 포함된 시간 이동 디버깅 로고입니다.

이 문서에서는 TTD.exe 명령줄 유틸리티를 사용하여 추적을 기록하는 시기와 방법을 설명합니다.

TTD.exe 명령줄 유틸리티를 사용하는 경우

TTD(시간 이동 디버깅)를 사용하면 앱 또는 프로세스의 코드 실행을 기록하고 추적 파일에 저장할 수 있습니다. Windows 디버거에서 파일을 재생하여 코드 실행 문제를 찾을 수 있습니다.

많은 시나리오에서 TTD를 사용하여 앱 또는 프로세스를 기록하는 가장 쉬운 방법은 WinDbg UI에서 직접 사용하는 것입니다. WinDbg UI를 사용한 시간 이동 디버깅에 대한 자세한 내용은 시간 이동 디버깅 - 개요를 참조하세요.

디버거를 설치하지 않고 PC에서 녹화, 고급 기록 시나리오, 테스트 자동화 등 TTD 명령줄 레코더만 필요한 시나리오가 있을 수 있습니다. 이러한 시나리오에서는 URL을 통해 TTD 명령줄 레코더만 설치할 수 있습니다.

TTD 녹음/녹화는 기록된 프로세스에 영향을 줍니다.

TTD 녹음은 침략적인 기술입니다. 애플리케이션 및 선택한 기록 옵션에 따라 녹화하는 동안 실행 중인 앱 또는 프로세스의 속도가 5x-20배 이상 느려지는 것을 볼 수 있습니다.

생성된 추적 파일은 시간이 지남에 따라 증가하며 상당한 스토리지 공간을 차지할 수 있습니다. 가장 짧은 기간 동안 추적하여 관심 있는 프로그램 활동을 캡처한 다음 가능한 한 빨리 추적을 닫습니다.

TTD가 프로세스에 연결되면 해당 프로세스에서 제거할 수 없습니다. TTD 녹음이 완료되면 앱을 닫거나 프로세스를 종료합니다. 시스템에 중요한 프로세스의 경우 OS를 다시 부팅해야 합니다.

TTD 녹음/녹화는 메모리 콘텐츠를 캡처하며 파일 경로, 레지스트리, 메모리 또는 파일 콘텐츠를 포함하지만 반드시 제한되지는 않는 개인 식별 또는 보안 관련 정보를 포함할 수 있습니다. 정확한 정보는 기록된 동안 대상 프로세스 활동에 따라 달라집니다.

TTD.exe 명령줄 유틸리티를 다운로드하고 설치하는 방법(기본 설정 방법)

여기에서 TTD 명령줄 유틸리티를 다운로드합니다. https://aka.ms/ttd/download

설치를 선택하면 TTD가 다운로드 및 설치됩니다. TTD 명령은 시스템 경로에 추가되며 설치가 완료되면 명령 프롬프트에서 사용할 수 있습니다.

설치에 문제가 있는 경우 앱 설치 관리자 파일의 설치 문제 해결을 참조하세요.

일부 PC에서는 Windows 10 Microsoft 앱 설치 관리자 설치해야 할 수 있습니다. Windows의 Microsoft Store 앱에서 사용할 수 있습니다. Windows 패키지 관리자 Windows 10 1809부터 앱 설치 관리자를 통해 지원됩니다.

TTD.exe 명령줄 유틸리티를 다운로드하고 설치하는 방법(오프라인 메서드)

기본 설치 방법은 앱 설치 관리자를 사용하는 것이지만 TTD 명령줄 패키지를 다운로드하고 파일을 수동으로 추출할 수도 있습니다. 이 작업을 수행하는 두 가지 방법은 다음과 같습니다.

이미 설치된 TTD.exe 명령줄 유틸리티에서 파일 추출

TTD 명령줄 유틸리티를 이미 설치한 경우 설치된 위치에서 파일을 추출할 수 있습니다. Powershell에서 이 작업을 수행하여 설치된 위치를 찾습니다.

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

여기에서 모든 이진 파일(*.dll, *.exe, *.sys)을 새 위치에 복사할 수 있습니다. Powershell에서 이 작업을 수행하는 한 가지 방법은 다음과 같습니다.

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

"c:\myttd"를 원하는 대상으로 바꿉니다. 결과는 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

x86 이진 파일은 하위 디렉터리에 있습니다. 32비트 프로세스를 기록할 필요가 없는 경우 이 폴더를 삭제할 수 있습니다(처음에 복사하지 않도록 robocopy 명령에 /xd x86을 추가할 수 있음). ARM64 버전에는 하위 디렉터리가 없습니다.

TTDRecordUI.dll UI를 사용하여 녹음/녹화를 제어하려는 경우에만 필요합니다. UI를 사용하지 않으려면 이 파일을 삭제할 수 있습니다.

TTD.exe 명령줄 유틸리티 패키지를 다운로드하고 파일을 수동으로 추출합니다.

TTD 명령줄 유틸리티를 설치하지 않으려면 패키지를 다운로드하고 파일을 수동으로 추출할 수 있습니다. 다음 Powershell 스크립트는 다음을 수행합니다.

  • 에서 현재 버전의 TTD에 대한 URL을 https://aka.ms/ttd/download가져옵니다.
  • MSIX 번들을 다운로드합니다.
  • MSIX 번들에서 요청된 아키텍처의 MSIX를 추출합니다.
  • MSIX에서 TTD 이진 파일을 추출합니다.
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."
}

위의 스크립트를 로 Get-Ttd.ps1저장했다고 가정하면 다음과 같이 실행하여 x64 이진 파일을 c:\myttd 디렉터리에 다운로드할 수 있습니다.

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

또는 출력 디렉터리 및 아키텍처를 지정할 수 있습니다.

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

"c:\myttd" 또는 "c:\myttd-arm64"를 원하는 대상으로 바꿉니다.

TTD.exe 명령줄 유틸리티를 사용하여 추적을 기록하는 방법

추적을 기록하는 방법에는 세 가지가 있습니다.

  • 프로세스 시작
  • 프로세스에 연결
  • 프로세스 모니터링

프로세스가 기록되면 디버그하려는 문제를 트리거해야 합니다. 문제가 있는 파일을 열거나 앱에서 특정 단추를 클릭하여 관심 있는 이벤트가 발생할 수 있습니다. 기록되는 애플리케이션이 자연스럽게 또는 크래시로 종료되면 추적 파일이 종료됩니다.

TTD 추적을 기록하려면 관리 권한이 필요합니다. 일반적으로 이 작업은 관리자 명령 프롬프트에서 ttd.exe 실행하여 수행됩니다.

WinDbg를 사용하여 시간 이동 추적을 기록하는 방법에 대한 자세한 내용은 시간 이동 디버깅 - 추적 기록을 참조하세요.

프로세스 시작

-launch <Program> [<arguments>]

프로그램을 시작하고 추적합니다(기본 모드).

이 모드는 프로그램에 인수를 전달할 수 있는 유일한 모드입니다. 프로그램은 TTD.exe(관리자)와 동일한 권한으로 시작됩니다. 또는 -monitor 를 사용하여 -attach 정상적인 권한 집합으로 프로그램을 기록합니다.

포함 -launch 은 선택 사항이지만 명확성을 위해 사용할 수 있습니다.

또는 /로 시작되지 않는 인식할 수 없는 첫 번째 인수는 시작할 실행 가능한 경로로 간주되며 후속 인수는 해당 프로그램의 인수로 간주됩니다.

예를 들어 를 사용하여 TTD.exe notepad.exe 메모장을 시작하고 기록합니다. 메모장을 닫으면 추적이 중지됩니다.

사용 예제는 시나리오 사용 예제 - 프로세스 기록을 참조하세요.

프로세스에 연결

-attach <PID>

프로세스 ID로 지정된 실행 중인 프로세스에 연결합니다. TaskManager 또는 TaskList 유틸리티를 사용하여 프로세스 번호를 식별합니다. 자세한 내용은 프로세스 ID 찾기를 참조하세요.

예를 들어 를 사용하여 TTD.exe -attach 21440 -out C:\traces\MyTraceFile.run 및 ID가 21440인 프로세스를 시작하고 기록하고 MyTraceFile.run에 추적을 저장합니다.

TTD.exe 실행하기 전에 디렉터리가 있는지 확인합니다(C:\traces 이 예제에서는).

예를 들어 사용법은 시나리오 - 실행 중인 프로세스 찾기 및 연결을 참조하세요.

프로세스 모니터링

-monitor <Program>

모니터 옵션을 사용하면 시작할 때마다 프로그램을 모니터링하고 추적할 수 있습니다. 이 옵션을 사용하려면 를 사용하여 출력 위치에 -out대한 전체 경로를 지정해야 합니다.

모니터링을 중지하려면 Ctrl+C를 누릅니다.

다른 방법에 비해 모니터링의 기본 이점은 다음과 같습니다.

  • 정상적인 방법으로 대상 앱을 시작할 수 있으며, 명령줄을 파악하여 시작할 필요가 없습니다.
  • 대상 앱은 정상적인 권한으로 실행됩니다. ttd.exe 앱을 직접 시작하면 관리자 권한으로 시작되며 프로그램의 동작이 변경될 수 있습니다.
  • 자동화에 유용합니다(프로그램 시작을 모니터링하고 추적을 수집하는 스크립트 사용).

-monitor 옵션을 두 번 이상 지정하여 여러 프로그램을 모니터링할 수 있습니다.

사용 예제는 시나리오 사용 예제 - 모니터링 프로세스를 참조하세요.

명령줄 옵션

Syntax

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

-? | -help

명령줄 도움말을 표시합니다.

모드

-launch <Program> [<arguments>]

프로그램을 시작하고 추적합니다(기본 모드).

이 모드는 프로그램에 인수를 전달할 수 있는 유일한 모드입니다. 옵션은 -launch 명령줄의 마지막 TTD 옵션이어야 하며, 그 다음에 시작할 프로그램 및 프로그램에 필요한 인수가 있어야 합니다. 모드를 지정하지 않으면 시작 모드로도 처리됩니다. 예를 들어 TTD.exe -out C:\traces ping.exe msn.com 는 시작으로 처리됩니다.

-attach <PID>

프로세스 ID로 지정된 실행 중인 프로세스에 연결합니다. TaskManager 또는 TaskList 유틸리티를 사용하여 프로세스 ID를 식별합니다. 자세한 내용은 프로세스 ID 찾기를 참조하세요.

-monitor <Program>

프로그램 또는 서비스가 시작될 때마다(다시 부팅될 때까지) 추적합니다. 이 옵션을 사용하려면 를 사용하여 출력 위치에 -out대한 전체 경로를 지정해야 합니다.

기본 명령줄 옵션

-out <path>

추적 파일 이름 또는 디렉터리를 지정합니다. 디렉터리가 있는 경우 디렉터리가 이미 있어야 합니다. 파일 이름인 경우 파일 이름이 없어야 합니다.

-noUI

녹음/녹화를 수동으로 제어하기 위해 UI를 사용하지 않도록 설정합니다.

이 옵션을 선택하지 않으면 녹화가 활성 상태일 때 작은 UI가 표시됩니다. "추적 끄기"는 추적을 중지하고 앱은 계속됩니다. "앱 종료"는 추적을 중지하는 앱을 닫습니다.

추적 상태 앱 종료 단추를 표시하는 작은 두 개의 단추 TTD UI 스크린샷

-accepteula

EULA 사용자 사용권 계약에 동의하려면 이 옵션을 사용합니다. 이 옵션은 EULA를 검토하고 수락한 후 자동화 시나리오에서 사용할 수 있습니다.

TTD는 처음 실행되면 EULA를 표시합니다. EULA를 수락하려면 Y 또는 N을 입력합니다. 수락되면 시작 시 ELA가 더 이상 표시되지 않습니다. EULA가 TTD 종료를 허용하지 않고 EULA가 표시되면 다음에 TTD가 실행됩니다.

추적 컨트롤

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

지정된 프로세스 이름 추적을 중지합니다. PID 또는 "all"을 지정할 수 있습니다.

-wait <timeout>

시스템의 모든 추적 세션이 끝날 때까지 지정된 시간(초)까지 기다립니다. 무한히 대기하려면 -1을 지정합니다.

-tracingOff

추적 기록을 해제하여 애플리케이션을 시작합니다. UI 확인란을 사용하여 추적이 꺼진 후 다시 켤 수 있습니다.

추가 명령줄 옵션

-children

대상뿐만 아니라 대상에서 만든 모든 프로세스를 기록합니다. 각 자식 프로세스는 자체 추적 파일에 기록됩니다.

-cmdLineFilter "<string>"

명령줄에 문자열이 포함된 경우 대상을 기록합니다. 이 옵션은 모드에서 -monitor 만 작동합니다. 명령줄 인수가 관심 있는 프로세스를 고유하게 식별하는 경우에 유용합니다. 예를 들어 레코드는 -monitor notepad.exe -cmdLineFilter "specialfile.txt" 명령줄에 specialfile.txt 표시되는 경우에만 notepad.exe.

-cleanup

프로세스 모니터 드라이버를 제거합니다.

추적 동작 설정

-timestampFilename

추적 파일 이름의 마지막 부분에 타임스탬프를 추가합니다. 예를 들어 ping_2023-06-17_103116.run입니다.

예를 들어 파일 이름에 타임스탬프가 포함된 ping.exe 기록하려면 이 명령을 사용합니다.

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

기본적으로 순차 검색은 출력 디렉터리에서 사용되지 않는 파일을 찾기 위해 수행됩니다. ping.exe 기록되면 레코더는 ping01.run, ping02.run 등을 시도합니다. 은 사용되지 않는 파일 이름을 찾을 때까지 입니다. 대부분의 시나리오에서 이 명명 방법은 충분합니다. 그러나 동일한 프로그램을 여러 번 기록하려는 경우 기존 파일이 많은 경우 기본 파일 명명 알고리즘이 비효율적일 수 있습니다.

-ring

링 버퍼를 추적합니다. 파일 크기는 에서 지정한 -maxFile제한을 초과하지 않습니다. 지정된 크기 내에 맞는 기록의 마지막 부분만 저장됩니다.

-maxFile <size>

추적 파일의 최대 크기(MB)입니다. 전체 추적 모드에서 기본값은 1024GB이고 최소값은 1MB입니다. 링 버퍼 모드에서 기본값은 2048MB이고 최소값은 1MB이고 최대값은 32768MB입니다.

32비트 프로세스의 메모리 내 링에 대한 기본값은 256MB입니다.

-maxConcurrentRecordings <count>

한 시점에서 진행될 수 있는 최대 녹음/녹화 수입니다. 지정하지 않으면 무제한의 녹음/녹화가 동시에 발생할 수 있습니다.

-numVCpu <number>

추적할 때 예약 및 사용할 여러 가상 CPU를 지정합니다. 이 값은 TTD를 통해 게스트 프로세스의 메모리에 배치된 총 메모리 오버헤드에 영향을 줍니다. 지정하지 않으면 플랫폼당 기본값은 x64/ARM64의 경우 55, x86의 경우 32입니다.

메모리가 부족한 경우에만 메모리 영향을 제한하도록 이 설정을 변경합니다. numVCpu 값을 더 낮은 숫자로 변경하면 추적 성능에 심각한 영향을 줄 수 있으며 메모리 사용 문제를 해결하기 위해 수행해야 합니다.

TTD.exe 기록하지 못하거나 .out 파일이 0초의 시뮬레이션을 나타내는 경우 를 사용하면 -numVCpu 녹음/녹화가 성공할 수 있습니다.

-replayCpuSupport <support>

추적을 재생하는 데 사용할 CPU에서 예상되는 지원을 지정합니다. 기본 설정은 컴퓨터 간 추적의 이식성을 위해 권장되지만 다른 옵션을 사용하여 작은 추적 파일을 생성하고 더 빠르게 기록할 수 있습니다(대상 프로그램에서 사용하는 특정 지침에 따라).

<support>

Description
Default 기본 CPU 지원은 재생 CPU에서 일반적으로 사용할 수 있는 기본 지원이 필요합니다.
MostConservative 재생 CPU에 특별한 지원이 필요하지 않습니다. ARM64 CPU의 Intel 추적과 같이 완전히 다른 CPU 아키텍처에서 재생되는 추적에 적합합니다.
MostAggressive 재생 CPU가 기록에 사용된 CPU와 비슷하고 동일하거나 더 큰 기능이라고 가정합니다.
IntelAvxRequired 재생 CPU가 AVX를 지원하는 Intel/AMD 64비트 CPU라고 가정합니다.
IntelAvx2Required 재생 CPU가 AVX2를 지원하는 Intel/AMD 64비트 CPU라고 가정합니다.

추적 오버헤드 감소

TTD는 수행하는 작업에 매우 효율적이지만(평균적으로 1 바이트/명령 미만으로 인코딩된 전체 명령 수준 추적), 기록할 때 여전히 눈에 띄는 오버헤드가 있습니다. 최신 CPU는 초당 수십억 개의 명령을 실행할 수 있으므로 1 바이트/명령도 비용이 많이 듭니다. 대부분의 경우 전체 프로세스를 기록할 필요가 없습니다.

다음 옵션을 사용하여 추적 오버헤드를 줄일 수 있습니다.

-module <module name>

지정된 모듈(예: comdlg32.dll)과 호출하는 코드만 기록합니다. 실행 파일 자체 또는 실행 파일이 로드한 DLL일 수 있습니다. 이 옵션은 여러 모듈을 기록하기 위해 두 번 이상 지정할 수 있습니다.

이 옵션을 사용하면 지정된 모듈의 코드가 실행될 때까지 대상 프로세스가 전체 속도로 실행됩니다. 그런 다음 TTD는 실행이 지정된 모듈을 떠날 때까지 프로세스를 기록합니다. 이때 기록이 꺼지고 대상이 최대 속도로 돌아갑니다. 기록 켜기/끄기는 비용이 많이 들기 때문에 TTD는 지정된 모듈이 프로세스의 다른 모듈을 호출할 때 녹화를 둡니다.

-recordmode <Automatic | Manual>

일반적으로 TTD가 대상 프로세스("자동" 모드, 기본값)에 삽입되는 즉시 기록이 시작됩니다. 프로그램에서 TTD의 In-Process 기록 API 를 사용하여 녹화가 발생하는 시기를 제어하는 경우 프로그램이 API를 호출하여 녹음을 시작할 때까지 "수동" 모드를 사용하여 최대 속도로 실행할 수 있습니다.

이러한 옵션을 사용하면 기록 오버헤드 및 추적 파일 크기가 크게 감소할 수 있습니다. 이러한 옵션을 사용하여 기록된 추적을 디버깅하는 것은 전체 프로세스의 추적과 다르지 않습니다. 녹음이 꺼진 추적의 위치에 도달할 때마다 추적의 다음 명령은 녹음이 다시 시작될 때 실행되는 첫 번째 명령입니다.

-passThroughExit

게스트 프로세스 종료 값을 TTD.exe 종료 값으로 전달합니다. 이 값은 변수를 통해 파일을 일괄 처리할 %ERRORLEVEL% 수 있습니다. Powershell 및 기타 명령줄 환경은 프로세스 종료 값을 가져오기 위한 메커니즘도 제공합니다.

-onInitCompleteEvent <eventName>

추적 초기화가 완료되면 이벤트를 신호를 받을 수 있습니다.

시나리오 사용 예제 - 프로세스 기록

시나리오 - Windows 앱 시작 및 기록

이 시나리오에서는 메모장을 시작하고 추적을 만듭니다.

  1. -launch 옵션을 사용하여 메모장을 시작하고 기록합니다.
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. 추적이 켜져 있음을 보여 주는 작은 애플리케이션 메뉴가 표시됩니다.

추적 상태 및 앱 종료 단추를 표시하는 TTD UI의 스크린샷

  1. 애플리케이션이 닫혀 있으면 추적 파일이 생성됩니다. 이 예제에서 notepad01.run.

시나리오 - 전달된 매개 변수를 사용하여 Windows 앱 시작 및 기록

이 시나리오에서는 ping이 시작되고 ping에 대한 주소가 매개 변수로 전달됩니다.

  1. 이 예제 -launch 에서는 옵션이 기본 모드이므로 생략됩니다.
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. 애플리케이션이 닫혀 있으면 추적 파일이 생성됩니다. 이 예제에서는 ping01.run을 참조하세요.

시나리오 - 실행 중인 프로세스 찾기 및 연결

이 시나리오 메모장에서는 프로세스 ID가 있으며 실행 중인 애플리케이션에 연결하여 추적을 만듭니다.

  1. 이 예제 메모장에서 대상 앱을 시작합니다.

  2. TaskList 또는 에 설명된 다른 메서드를 사용하여 프로세스 ID를 찾습니다. 자세한 내용은 프로세스 ID 찾기를 참조하세요.

C:\TTD> TaskList
...
Notepad.exe                  21440 Console                    1     73,020 K
...
  1. 해당 프로세스 ID를 -attach 사용하여 연결하고 기록하는 옵션을 사용합니다. 필요에 따라 를 사용하여 -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

시나리오 - 부모 및 해당 자식 프로세스 기록

이 시나리오에서는 부모 및 해당 자식 프로세스가 기록됩니다. 일부 앱은 많은 자식 프로세스를 사용할 수 있으므로 자식이 포함된 가족 추적 파일은 상당히 커질 수 있습니다.

  1. 기록할 -children 부모 앱의 옵션과 이름을 지정합니다.

이는 자식 프로세스로 ping.exe 시작하는 cmd.exe 기록하는 예입니다.

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. 부모 프로세스용 추적 파일과 각 자식 프로세스에 대한 추적 파일 등 여러 추적 파일이 만들어집니다. WinDbg는 한 번에 하나의 추적 파일만 열므로 동시에 디버그하려는 경우 각 추적에 대해 별도의 WinDbg 인스턴스를 실행해야 합니다.

시나리오 사용 예제 - 모니터링 프로세스

시나리오 - 프로그램 시작 및 녹화 시작 모니터링

이 시나리오 -monitor 에서는 시스템이 다시 부팅되거나 Ctrl+C를 통해 ttd.exe 종료될 때까지 현재 실행 중인 모든 인스턴스와 향후 notepad.exe 인스턴스를 기록하는 데 옵션이 사용됩니다. 옵션은 -out 모니터에 필요하며 출력 폴더가 이미 있어야 합니다.

  1. 현재 및 향후 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. 이 예제에서는 추적이 시작된 후 두 개의 notepad.exe 인스턴스가 로드되었습니다. 관심 활동이 캡처된 후 Ctrl-C는 명령 프롬프트에서 녹음/녹화를 중지하는 데 사용되었습니다.

시나리오 - 프로그램 시작에 대한 두 프로그램 모니터링

이 시나리오 -monitor 에서는 옵션을 사용하여 두 애플리케이션을 모니터링하고 기록합니다.

  1. 현재 및 notepad.exe 및 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. 이 예제에서는 추적이 시작된 후 notepad.exe ping.exe 로드되었습니다. 관심 활동이 캡처된 후 Ctrl-C는 명령 프롬프트에서 녹음/녹화를 중지하는 데 사용되었습니다.

시나리오 - 두 번째 창에서 기록 중지

이 시나리오에서는 관심 있는 활동이 캡처되고 모든 녹음/녹화가 를 사용하여 -stop all중지됩니다. 두 번째 명령 창은 옵션을 실행하는 -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'

시나리오 - 모니터 드라이버 정리

이 시나리오 -cleanup 에서 옵션은 모든 기록이 완료된 후 모니터 드라이버를 클린 데 사용됩니다.

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

추가 명령줄 예제

이 표에서는 몇 가지 추가 명령줄 사용 예제를 강조 표시합니다. 설명된 옵션에 대한 자세한 내용은 명령줄 옵션을 참조하세요.

시나리오 명령 Description
프로세스에 연결하지만 아직 녹음/녹화를 시작하지 않음 Ttd.exe -tracingoff notepad.exe 녹음/녹화가 꺼진 상태에서 메모장을 시작합니다. 녹음/녹화는 UI를 통해 언제든지 시작할 수 있습니다.
명령줄별로 필터링 Ttd.exe -cmdlinefilter foo.txt -monitor notepad.exe notepad.exe 기록하지만 foo.txt 실행 시 명령줄에 있는 경우에만 출력을 현재 디렉터리에 배치합니다.
링 레코딩 Ttd.exe -ring -attach 1234 PID 1234를 2GB로 제한되는 추적 파일에 기록하여 출력을 현재 디렉터리에 배치합니다. 추적 파일의 이전 콘텐츠는 파일을 최대 크기로 유지하기 위해 필요에 따라 덮어씁니다.

최대 크기를 변경하는 데 사용합니다 -maxfile .
추적 파일 크기 제한 Ttd.exe -maxfile 4096 notepad.exe 추적 파일이 4GB에 도달할 때까지 notepad.exe 기록하여 출력을 현재 디렉터리에 배치합니다.
동시에 발생하는 녹음/녹화 수 제한 Ttd.exe -maxconcurrentrecordings 1 -out c:\my\dir -monitor notepad.exe 녹음/녹화는 CPU 집약적이며 경우에 따라 발생합니다.
대상 프로세스에서 메모리 사용량 감소 Ttd.exe -numvcpu 8 -monitor w3wp.exe w3wp.exe 같은 일부 프로세스는 사용할 수 있는 메모리 양에 대해 작은 할당량을 설정합니다. ttd.exe 기록을 시작하지 못하는 경우 를 사용하여 -numvcpu 가상 CPU TTD 할당 수를 줄입니다. ttd.exe 다른 방법을 통해 기록할 수 없는 경우에만 이 옵션을 사용해 보세요.
추적 이식성과 기록 속도/추적 파일 크기 중에서 선택 Ttd.exe -replaycpusupport mostaggressive notepad.exe 기본적으로 TTD는 광범위한 하드웨어에서 이식 가능한 추적 파일을 생성합니다. 'mostaggressive'를 선택하면 추적을 기록한 컴퓨터와 동일한 기능으로 CPU에서만 재생할 수 있는 추적을 기록해도 괜찮다는 것을 TTD에 알릴 수 있습니다. 경우에 따라 기록 속도 및 추적 파일 크기를 크게 향상시킬 수 있습니다.

Automation 명령줄 예제

이 표에서는 TTD.exe 유틸리티의 자동 사용에 유용할 수 있는 몇 가지 추가 명령줄 사용 예제를 강조 표시합니다.

시나리오 명령 Description
UI 사용 안 함 Ttd.exe -noui -accepteula notepad.exe UI를 표시하지 않고 출력을 현재 디렉터리에 배치하는 notepad.exe 기록합니다.
레코더가 프로그래밍 방식으로 시작될 때까지 기다립니다. Ttd.exe -accepteula -oninitcompleteevent ttd_notepad notepad.exe 이름이 'ttd_notepad'인 Win32 이벤트를 만들고 notepad.exe 시작합니다. TTD는 녹음이 초기화될 때 'ttd_notepad'을 신호합니다. Automation은 기록하려는 동작을 계속하기 전에 이벤트를 대기할 수 있습니다.
대상의 종료 코드 유지 Ttd.exe -accepteula -passthroughexit ping.exe msn.com 현재 디렉터리에 출력을 배치하여 ping.exe 기록합니다. Ttd.exe 종료 코드는 ping.exe 종료 코드와 동일합니다.
녹음/녹화가 끝날 때까지 기다립니다. Ttd.exe -accepteula -wait 30 녹화가 중지된 후 TTD가 디스크에 추적 파일 쓰기를 완료할 때까지 최대 30초 동안 기다립니다. 무한정 기다리려면 -wait -1을 사용합니다.

이러한 모든 예제에서는 옵션을 사용하여 -accepteula EULA 확인 대화 상자에서 자동화가 차단되지 않도록 합니다.

생성된 추적 파일 작업

시간 이동 추적을 재생하고 시간 이동 디 버깅 - 추적 재생을 참조하세요.

추적 파일 작업에 대한 팁

  • 추적을 다른 사용자와 공유할 때 .run 파일만 공유하면 됩니다. 인덱스 파일(.idx)은 .run 파일만큼 클 수 있으며 WinDbg에서 추적 파일을 로드할 때 자동으로 만들어집니다.
  • 다른 사용자와 공동 작업할 때 현재 문제와 관련된 모든 관련 추적 위치를 전달합니다. 협력자는 명령을 사용하여 !tt x:y 코드 실행 시 정확한 시점으로 이동할 수 있습니다. 시간 위치 범위를 버그 설명에 포함하여 가능한 문제가 발생할 수 있는 위치를 추적할 수 있습니다.
  • TTD 문제를 보고할 때 .run 파일을 제공하는 경우 .out 파일도 제공합니다. 이렇게 하면 기록 프로세스가 제대로 작동했음을 확인할 수 있습니다.
  • 추적 파일(.run)은 잘 압축됩니다.

문제 해결 TTD.exe

추적 파일 오류가 발생할 수 있는 경우도 있습니다. 자세한 내용은 시간 이동 디버깅 - 문제 해결을 참조하세요.

.out 파일을 문제 해결에 사용할 수 있습니다. 예제 out 파일은 0의 종료 코드로 끝나는 기능 추적을 보여줍니다.

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)

대부분의 .out 파일 콘텐츠는 시간 이동 디버깅 팀에서 내부적으로 기록 오류를 해결하는 데 사용됩니다. 다음 정보는 추적 파일을 사용하는 다른 사용자에게 유용할 수 있습니다.

  • 일부 오류 메시지는 .out 파일에만 표시되며 오류의 세부 사항을 확인하는 데 사용할 수 있습니다.
  • 녹음/중지된 벽시계 시간 표시
  • 녹음/녹화 세션이 지속된 기간(시뮬레이션 시간)
  • 녹음/녹화가 실행(명령줄 포함) 또는 연결 기록인지 여부
  • OS 버전

참고 항목

시간 이동 디버깅 - 개요

시간 이동 디버깅 - 추적 기록

시간 이동 디버깅 - 추적 재생