wt (追蹤和監看資料)
當您在函數調用開始時執行此命令時,wt 命令會透過整個函式執行,然後顯示統計數據。
wt [WatchOptions] [= StartAddress] [EndAddress]
參數
WatchOptions
指定如何修改顯示。 您可以使用下列任一選項。
選項 | 效果 |
---|---|
-l 深度 |
(僅限使用者模式)指定要顯示之呼叫的最大深度。 至少比起點更深的任何呼叫,會以無訊息方式執行。 |
-m 模組 |
(僅限使用者模式)將顯示限制為指定模組內的程序代碼,加上從該模組進行的第一層呼叫。 您可以包含多個 -m 選項,以顯示來自多個模組的程式代碼,而沒有其他模組。 |
-i 模組 |
(僅限使用者模式)忽略指定模組內的任何程序代碼。 您可以包含多個 -i 選項,以忽略多個模組的程式代碼。 如果您使用 -m 選項,調試程式會忽略所有 -i 選項。 |
-鎳 |
(僅限使用者模式)不會顯示因 -m 或 -i 選項而忽略之程序代碼中的任何專案。 |
-數控 |
不會顯示個別的通話資訊。 |
-ns |
不會顯示摘要資訊。 |
-西北 |
不會在追蹤期間顯示警告。 |
-oa |
(僅限使用者模式)顯示通話網站的實際位址。 |
-or |
(僅限使用者模式)使用預設基數做為基底,顯示所呼叫函式的傳回緩存器值。 |
-或 |
(僅限使用者模式)針對每個傳回值,顯示所呼叫函式的傳回緩存器值。 |
StartAddress
指定除錯程式開始執行的位址。 如果您未使用 StartAddress,執行會從指令指標指向的指令開始。 如需語法的詳細資訊,請參閱 地址和地址範圍語法。
EndAddress
指定追蹤結束的位址。 如果您未使用 EndAddress,則會執行單一指令或函數調用。
Environment
模式 |
使用者模式、核心模式 |
目標 |
僅限即時偵錯 |
平台 |
使用者模式: 所有 核心模式: 僅限 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 個指令,包括 printf 和 fgets,然後在呼叫這些函式之後執行 54545 個額外的指令,但在發出更多呼叫之前。 不過,在最終計數中,顯示顯示 myFunction 執行 112,379 個指令,因為此計數包含 myFunction 及其子系執行的所有指示。 (myFunction 的子系是直接或間接從 myFunction 呼叫的函式。
在上述範例中,另 請注意,ILT+1440 (__isatty) 呼叫 21 次。 在最終計數中,此函式行為的摘要會顯示呼叫的次數、任何單一執行的指令數目最小、任何單一執行的指令數目上限,以及每個執行的平均指令數目。
如果進行任何系統呼叫,它們會出現在計數器中,並在命令輸出結尾再次列出。