다음을 통해 공유


wt(추적 및 조사식 데이터)

wt 명령은 전체 함수를 통해 실행된 다음 함수 호출의 시작 부분에서 이 명령을 실행할 때 통계를 표시합니다.

wt [WatchOptions] [= StartAddress] [EndAddress] 

매개 변수

WatchOptions
디스플레이를 수정하는 방법을 지정합니다. 다음 옵션 중 원하는 옵션을 사용할 수 있습니다.

옵션 영향

-l깊이

(사용자 모드만 해당) 표시할 호출의 최대 깊이를 지정합니다. 최소한 깊이 수준이 시작점보다 더 깊은 호출은 자동으로 실행됩니다.

-m모듈

(사용자 모드만 해당) 지정된 모듈 내의 코드와 해당 모듈에서 수행한 호출의 첫 번째 수준으로 표시를 제한합니다. 여러 모듈의 코드를 표시하고 다른 모듈을 표시하지 않는 여러 -m 옵션을 포함할 수 있습니다.

-i모듈

(사용자 모드만 해당) 지정된 모듈 내의 모든 코드를 무시합니다. 여러 모듈의 코드를 무시하는 여러 -i 옵션을 포함할 수 있습니다. -m 옵션을 사용하는 경우 디버거는 모든 -i 옵션을 무시합니다.

-Ni

(사용자 모드만 해당) -m 또는 -i 옵션으로 인해 무시되는 코드에 대한 항목을 표시하지 않습니다.

-노스캐롤라이나

개별 통화 정보를 표시하지 않습니다.

-Ns

요약 정보를 표시하지 않습니다.

-Nw

추적 중에 경고를 표시하지 않습니다.

-Oa

(사용자 모드만 해당) 통화 사이트의 실제 주소를 표시합니다.

-or

(사용자 모드만 해당) 기본 radix를 기본으로 사용하여 호출된 함수의 반환 레지스터 값을 표시합니다.

-또는

(사용자 모드만 해당) 호출된 함수의 반환 레지스터 값을 각 반환 값에 적절한 형식으로 표시합니다.

StartAddress
디버거가 실행을 시작하는 주소를 지정합니다. StartAddress를 사용하지 않으면 명령 포인터가 가리키는 명령에서 실행이 시작됩니다. 구문에 대한 자세한 내용은 주소 및 주소 범위 구문을 참조하세요.

EndAddress
추적이 끝나는 주소를 지정합니다. EndAddress를 사용하지 않으면 단일 명령 또는 함수 호출이 실행됩니다.

Environment

모드

사용자 모드, 커널 모드

대상

라이브 디버깅만

플랫폼

사용자 모드: 모든 커널 모드: x86 기반 전용

추가 정보

wt 명령 실행 및 관련 명령 개요에 대한 자세한 내용은 대상 제어를 참조하세요.

설명

wt 명령은 특정 함수의 동작에 대한 정보를 원하지만 함수를 단계별로 실행하지 않으려는 경우에 유용합니다. 대신 해당 함수의 시작 부분으로 이동한 다음 wt 명령을 실행합니다.

프로그램 카운터가 기호(예: 함수의 시작점 또는 모듈 진입점)에 해당하는 지점에 있는 경우 wt 명령은 현재 반환 주소에 도달할 때까지 추적합니다. 프로그램 카운터가 호출 명령에 있는 경우 wt 명령은 현재 위치로 반환될 때까지 추적합니다. 이 추적은 디버거 명령 창에서 명령 이 발생하는 다양한 호출을 설명하는 출력과 함께 프로파일링됩니다.

wt 명령이 함수의 시작이 아닌 다른 곳에서 실행되면 명령은 p(단계) 명령처럼 동작합니다. 그러나 EndAddress를 지정하는 경우 이 실행에 많은 프로그램 단계 및 함수 호출이 포함되더라도 해당 주소에 도달할 때까지 실행이 계속됩니다.

소스 모드에서 디버깅하는 경우 함수 본문의 여는 대괄호가 표시되는 지점까지만 함수를 추적해야 합니다. 그런 다음 wt 명령을 사용할 수 있습니다. (일반적으로 함수의 첫 번째 줄에 중단점을 삽입하거나 디버그 | 를 사용하는 것이 더 쉽습니다. 커서로 실행한 다음 wt 명령을 사용합니다.)

wt의 출력은 길 수 있으므로 로그 파일을 사용하여 출력을 기록하는 것이 좋습니다.

다음 예제에서는 일반적인 로그 파일을 보여줍니다.

0:000> l+                  Source options set to show source lines
Source options are f:
     1/t - Step/trace by source line
     2/l - List source line for LN and prompt
     4/s - List source code at prompt
     8/o - Only show source code at prompt
0:000> p                   Not yet at the function call: use "p"
>  44:       minorVariableOne = 12;
0:000> p
>  45:       variableOne = myFunction(2, minorVariable);
0:000> t                   At the function call: now use "t"
MyModule!ILT+10(_myFunction):
0040100f e9cce60000      jmp     MyModule!myFunction (0040f6e0)
0:000> t
>  231:    { 
0:000> wt                  At the function beginning:  now use "wt"
Tracing MyModule!myFunction to return address 00401137

  105     0 [  0] MyModule!myFunction
    1     0 [  1]   MyModule!ILT+1555(_printf)
    9     0 [  1]   MyModule!printf
    1     0 [  2]     MyModule!ILT+370(__stbuf)
   11     0 [  2]     MyModule!_stbuf
    1     0 [  3]       MyModule!ILT+1440(__isatty)
   14     0 [  3]       MyModule!_isatty
   50    15 [  2]     MyModule!_stbuf
   17    66 [  1]   MyModule!printf
    1     0 [  2]     MyModule!ILT+980(__output)
   59     0 [  2]     MyModule!_output
   39     0 [  3]       MyModule!write_char
  111    39 [  2]     MyModule!_output
   39     0 [  3]       MyModule!write_char

....

   11     0 [  5]           kernel32!__SEH_epilog4
   54 11675 [  4]         kernel32!ReadFile
  165 11729 [  3]       MyModule!_read
  100 11895 [  2]     MyModule!_filbuf
   91 11996 [  1]   MyModule!fgets
54545 83789 [  0] MyModule!myFunction
    1     0 [  1]   MyModule!ILT+1265(__RTC_CheckEsp)
    2     0 [  1]   MyModule!_RTC_CheckEsp
54547 83782 [  0] MyModule!myFunction

112379 instructions were executed in 112378 events (0 from other threads)

Function Name                               Invocations MinInst MaxInst AvgInst
MyModule!ILT+1265(__RTC_CheckEsp)                     1       1       1       1
MyModule!ILT+1440(__isatty)                          21       1       1       1
MyModule!ILT+1540(__ftbuf)                           21       1       1       1
....
ntdll!memcpy                                         24       1      40      19
ntdll!memset                                          2      29      29      29

23 system calls were executed

Calls  System Call
   23  ntdll!KiFastSystemCall

추적 목록에서 첫 번째 숫자는 실행된 명령 수를 지정하고, 두 번째 숫자는 함수의 자식 프로세스에서 실행된 명령 수를 지정하고, 세 번째 숫자(대괄호)는 스택의 함수 깊이를 지정합니다(초기 함수를 0으로 사용). 함수 이름을 들여쓰면 호출 깊이가 표시됩니다.

앞의 예제에서 MyModule!myFunction은printffgets를 비롯한 여러 하위루틴을 호출하기 전에 105개의 명령을 실행한 다음, 해당 함수를 호출한 후 몇 가지 호출을 더 실행하기 전에 54545 추가 지침을 실행합니다. 그러나 최종 개수에서 이 개수에는 myFunction 과 해당 자식이 실행하는 모든 명령이 포함되므로 myFunction 에서 112,379개의 명령이 실행되었음을 표시합니다. (myFunction자식은 직접 또는 간접적으로 myFunction에서 호출되는 함수입니다.)

앞의 예제에서는 ILT+1440(__isatty) 을 21번 호출합니다. 최종 개수에서 이 함수의 동작 요약은 호출된 횟수, 단일 실행에서 가장 적은 수의 명령, 단일 실행에서 가장 많은 명령 수 및 실행당 평균 명령 수를 보여 줍니다.

시스템 호출이 발생하면 카운터에 표시되고 명령 출력의 끝에 다시 나열됩니다.