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 個指令,包括 printf 和 fgets,然後在呼叫這些函式之後執行 54545 個其他指令,但在發出更多呼叫之前。 不過,在最終計數中,顯示 myFunction 會執行 112,379 個指令,因為此計數包含 myFunction 及其子系執行的所有指令。 (myFunction的子系是從myFunction直接或間接呼叫的函式。)
在上述範例中,也請注意 ,ILT+1440 (__isatty) 稱為 21 次。 在最後計數中,此函式行為的摘要會顯示呼叫的次數、任何單一執行的指令數目下限、任何單一執行的指令數目上限,以及每個執行的平均指令數目。
如果發出任何系統呼叫,它們會出現在計數器中,並在命令輸出結束時再次列出。
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應