wt (追蹤和監看資料)

當您在函式呼叫開始時執行此命令時, wt 命令會透過整個函式執行,然後顯示統計資料。

wt [WatchOptions] [= StartAddress] [EndAddress] 

參數

WatchOptions
指定如何修改顯示。 您可以使用下列任一選項。

選項 效果

-l深度

(使用者模式) 指定要顯示的呼叫最大深度。 至少深度層級比起點更深的任何呼叫都會以無訊息方式執行。

-m模組

(使用者模式) 限制顯示至指定模組內的程式碼,以及從該模組進行的第一層呼叫。 您可以包含多個 -m 選項,以顯示來自多個模組的程式碼,而且沒有其他模組。

-i模組

(使用者模式) 忽略指定模組內的任何程式碼。 您可以包含多個 -i 選項,以忽略多個模組中的程式碼。 如果您使用 -m 選項,偵錯工具會忽略所有 -i 選項。

-鎳

(使用者模式) 不會顯示因為 -m 或 -i 選項而忽略的任何程式碼專案。

-數控

不會顯示個別的通話資訊。

-Ns

不會顯示摘要資訊。

-西北

在追蹤期間不會顯示警告。

-Oa

(使用者模式) 顯示通話網站的實際位址。

-or

(使用者模式) 顯示所呼叫函式的傳回暫存器值,並使用預設的弧度做為基底。

-或

(使用者模式) 針對每個傳回值顯示所呼叫函式的傳回暫存器值。

StartAddress
指定偵錯工具開始執行的位址。 如果您未使用 StartAddress,則執行會從指令指標指向的指令開始。 如需語法的詳細資訊,請參閱 位址和位址範圍語法

EndAddress
指定追蹤結束的位址。 如果您未使用 EndAddress,則會執行單一指令或函式呼叫。

環境

模式

使用者模式、核心模式

目標

僅限即時偵錯

平台

使用者模式: 所有 核心模式: 僅限 x86 型

其他資訊

如需發出 wt 命令和相關命令概觀的詳細資訊,請參閱 控制目標

備註

如果您想要特定函式的行為相關資訊,但不想逐步執行函式, 則 wt 命令很有用。 請改為移至該函式的開頭,然後發出 wt 命令。

如果程式計數器位於對應至符號 (,例如函式的開頭或進入點至模組) , 則 wt 命令會追蹤直到到達目前的傳回位址為止。 如果程式計數器位於 呼叫 指令上, 則 wt 命令會追蹤直到它返回目前的位置為止。 此追蹤會在 [偵錯工具命令] 視窗中 進行剖析,以及描述命令遇到的各種呼叫的輸出。

如果 wt 命令在函式開頭以外的位置發出,命令的行為就像 p (Step) 命令一樣。 不過,如果您指定 EndAddress,執行會繼續直到達到該位址為止,即使此執行牽涉到許多程式步驟和函式呼叫也一樣。

當您在來源模式中偵錯時,應該只會追蹤函式中您看到函式主體的左括弧。 然後,您可以使用 wt 命令。 (通常更容易在函式的第一行插入中斷點,或使用 偵錯 |執行至 Cursor,然後使用 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

在追蹤清單中,第一個數位會指定已執行的指令數目、第二個數字會指定函式子進程所執行的指令數目,而括弧中的第三個數字 () 指定堆疊中函式的深度, (將初始函式當做零) 。 函式名稱的縮排會顯示呼叫深度。

在上述範例中, MyModule!myFunction 會在呼叫數個子程式之前執行 105 個指令,包括 printffgets,然後在呼叫這些函式之後執行 54545 個其他指令,但在發出更多呼叫之前。 不過,在最終計數中,顯示 myFunction 會執行 112,379 個指令,因為此計數包含 myFunction 及其子系執行的所有指令。 (myFunction子系是從myFunction直接或間接呼叫的函式。)

在上述範例中,也請注意 ,ILT+1440 (__isatty) 稱為 21 次。 在最後計數中,此函式行為的摘要會顯示呼叫的次數、任何單一執行的指令數目下限、任何單一執行的指令數目上限,以及每個執行的平均指令數目。

如果發出任何系統呼叫,它們會出現在計數器中,並在命令輸出結束時再次列出。