1.!runaway
!runaway命令顯示每個執行緒消費的時間
bit 0 (0x1) 讓偵錯程式顯示每個執行緒消耗的使用者模式時間(user time),預設不加就是0x1
bit 1 (0x2) 顯示每個執行緒消耗的核心時間(kernel time)。
bit 2 (0x4) 顯示每個執行緒從建立開始經歷了多少時間。
就是三者的組合:1 2 3 4 5 6 7
0:002> !runaway
user mode time
thread time
0:890 0 days 0:00:00.031
2:a00 0 days 0:00:00.000
1:1174 0 days 0:00:00.000
0:002> !runaway 1
user mode time
thread time
0:890 0 days 0:00:00.031
2:a00 0 days 0:00:00.000
1:1174 0 days 0:00:00.000
0:002> !runaway 2
kernel mode time
thread time
0:890 0 days 0:00:00.062
2:a00 0 days 0:00:00.000
1:1174 0 days 0:00:00.000
0:002> !runaway 3
user mode time
thread time
0:890 0 days 0:00:00.031
2:a00 0 days 0:00:00.000
1:1174 0 days 0:00:00.000
kernel mode time
thread time
0:890 0 days 0:00:00.062
2:a00 0 days 0:00:00.000
1:1174 0 days 0:00:00.000
0:002> !runaway 4
elapsed time
thread time
0:890 0 days 0:38:34.825
1:1174 0 days 0:38:34.793
2:a00 0 days 0:38:24.528
0:002> !runaway 7
user mode time
thread time
0:890 0 days 0:00:00.031
2:a00 0 days 0:00:00.000
1:1174 0 days 0:00:00.000
kernel mode time
thread time
0:890 0 days 0:00:00.062
2:a00 0 days 0:00:00.000
1:1174 0 days 0:00:00.000
elapsed time
thread time
0:890 0 days 0:38:41.825
1:1174 0 days 0:38:41.793
2:a00 0 days 0:38:31.528
該擴充套件命令可以用來快速找出哪些執行緒迴圈失去控制消耗了太多cpu時間。輸出中以偵錯程式的內部執行緒號和16進製制執行緒id來標識每個執行緒。還會顯示偵錯程式id,當然,主要用於分析dump檔案
2~
波形符(~) 命令顯示指定執行緒或當前程序中的所有執行緒的資訊
這條命令顯示所有執行緒
0:001>~
該命令也顯示所有執行緒。
0:001>~*
下面的命令顯示當前活動執行緒。
0:001>~.
下面的命令顯示原始的產生異常的執行緒(或偵錯程式附加到程序時活動的執行緒)。
0:001>~#
下面顯示號碼為2的執行緒。
0:001>~2
0:002> ~
0 id: 17a4.eb4 suspend: 1 teb: 7ffdf000 unfrozen
1 id: 17a4.d4c suspend: 1 teb: 7ffde000 unfrozen
. 2 id: 17a4.aac suspend: 1 teb: 7ffdd000 unfrozen
0:002> ~*
0 id: 17a4.eb4 suspend: 1 teb: 7ffdf000 unfrozen
start: calc!winmaincrtstartup (01012475)
priority: 0 priority class: 32 affinity: f
1 id: 17a4.d4c suspend: 1 teb: 7ffde000 unfrozen
start: winimhc!tgetlogconfig+0x507b (10012f7b)
priority: 0 priority class: 32 affinity: f
. 2 id: 17a4.aac suspend: 1 teb: 7ffdd000 unfrozen
priority: 0 priority class: 32 affinity: f
0:002> ~0
0 id: 17a4.eb4 suspend: 1 teb: 7ffdf000 unfrozen
start: calc!winmaincrtstartup (01012475)
priority: 0 priority class: 32 affinity: f
0:002> ~#
. 2 id: 17a4.aac suspend: 1 teb: 7ffdd000 unfrozen
priority: 0 priority class: 32 affinity: f
我們可以發現,~和~*還是有點區別的,~*會把入口函式和優先順序都列印出來,
0 id: 17a4.eb4 suspend: 1 teb: 7ffdf000 unfrozen意思是0號執行緒,程序id為17a4,執行緒id為eb4,暫停數為1,未凍結狀態
,每個執行緒都包含了乙個暫停計數(suspend count),以及乙個凍結/解凍(frozen/unfrozen)的狀態。
暫停計數由windows核心使用的值,可以通過suspendthread和resumethread這兩個系統函式來控制的,核心程式設計裡說乙個執行緒建立時,暫停次數為1,
當執行緒完全初始化後,系統就要檢視create_suspend標誌是否已經傳遞給createthread。如果該標誌沒有傳遞,系統便將執行緒的暫停計數遞減為0,
該執行緒可以排程到乙個程序中
也可以用~n增加暫停計數,用~m減少暫停計數,如下:
0:002> ~0n
0:002> ~
0 id: 17a4.eb4 suspend: 2 teb: 7ffdf000 unfrozen
1 id: 17a4.d4c suspend: 1 teb: 7ffde000 unfrozen
. 2 id: 17a4.aac suspend: 1 teb: 7ffdd000 unfrozen
0:002> ~0m
0:002> ~
0 id: 17a4.eb4 suspend: 1 teb: 7ffdf000 unfrozen
1 id: 17a4.d4c suspend: 1 teb: 7ffde000 unfrozen
. 2 id: 17a4.aac suspend: 1 teb: 7ffdd000 unfrozen
0:002> ~0m
0:002> ~
0 id: 17a4.eb4 suspend: 0 teb: 7ffdf000 unfrozen
1 id: 17a4.d4c suspend: 1 teb: 7ffde000 unfrozen
. 2 id: 17a4.aac suspend: 1 teb: 7ffdd000 unfrozen
0:002> ~1m
0:002> ~
0 id: 17a4.eb4 suspend: 0 teb: 7ffdf000 unfrozen
1 id: 17a4.d4c suspend: 0 teb: 7ffde000 unfrozen
. 2 id: 17a4.aac suspend: 1 teb: 7ffdd000 unfrozen
比如我只呼叫一次~0n,那麼主線程的引用計數變為2了,我再呼叫g,主線程的引用計數變為1,我們的calc是執行不起來的!
凍結狀態是偵錯程式的狀態,在window作業系統中是不支援這個概念,對於每個被凍結的執行緒,偵錯程式將記住這個狀態,並且在除錯事件被處理之前增加執行緒的掛起計數,當除錯事件被處理完畢時,掛起計數將被遞減,對應的命令為:
凍結~f
解凍~u
凍結命令數量必須和解凍命令數量相等
WinDBG常用除錯命令
查詢符號 3.檢視 event 物件的訊號狀態 object basenamedobjects dt b nt kevent xx 4.檢視 lasterror 值 gle 5.指定進製形式,0x 0n 0t 0y 分別表示 16 10 8 2 進製 0x12345678 0n10 evaluate...
WinDbg常用除錯命令
寫在前面的話 除錯當然可以用windbg,樓主發現先用debugdiagnostictool來分析更棒。但是樓主發現1.2版的debugdiag有advanced analysis,但2.0版本又沒有了,非常不解,看來只能用1.2版本。分析前先設定pdb路徑,tools options and se...
windbg 命令 4 windbg除錯符號表1
我們都知道,程式根據配置不同,可以build成release和debug兩個版本。一般發布出去的是release版本,相比debug版本,release版本檔案小,執行快,但相對的,其攜帶的資訊也更少。所以開發人員在遇見問題時,都會build乙個debug版本去重現場景,然後通過偵錯程式去發現roo...