日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Windbg命令学习6(!runaway和~)

發布時間:2023/11/30 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Windbg命令学习6(!runaway和~) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.!runaway

!runaway命令顯示每個線程消費的時間

Bit 0 (0x1) 讓調試器顯示每個線程消耗的用戶模式時間(user time),默認不加就是0x1Bit 1 (0x2) 顯示每個線程消耗的內核時間(kernel time)。 Bit 2 (0x4) 顯示每個線程從創建開始經歷了多少時間。 就是三者的組合:1 2 3 4 5 6 70:002> !runaway User Mode TimeThread Time0:890 0 days 0:00:00.0312:a00 0 days 0:00:00.0001:1174 0 days 0:00:00.000 0:002> !runaway 1User Mode TimeThread Time0:890 0 days 0:00:00.0312:a00 0 days 0:00:00.0001:1174 0 days 0:00:00.000 0:002> !runaway 2Kernel Mode TimeThread Time0:890 0 days 0:00:00.0622:a00 0 days 0:00:00.0001:1174 0 days 0:00:00.000 0:002> !runaway 3User Mode TimeThread Time0:890 0 days 0:00:00.0312:a00 0 days 0:00:00.0001:1174 0 days 0:00:00.000Kernel Mode TimeThread Time0:890 0 days 0:00:00.0622:a00 0 days 0:00:00.0001:1174 0 days 0:00:00.000 0:002> !runaway 4Elapsed TimeThread Time0:890 0 days 0:38:34.8251:1174 0 days 0:38:34.7932:a00 0 days 0:38:24.528 0:002> !runaway 7User Mode TimeThread Time0:890 0 days 0:00:00.0312:a00 0 days 0:00:00.0001:1174 0 days 0:00:00.000Kernel Mode TimeThread Time0:890 0 days 0:00:00.0622:a00 0 days 0:00:00.0001:1174 0 days 0:00:00.000Elapsed TimeThread Time0:890 0 days 0:38:41.8251:1174 0 days 0:38:41.7932: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 Unfrozen1 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 UnfrozenStart: calc!WinMainCRTStartup (01012475) Priority: 0 Priority class: 32 Affinity: f1 Id: 17a4.d4c Suspend: 1 Teb: 7ffde000 UnfrozenStart: winimhc!TGetLogConfig+0x507b (10012f7b) Priority: 0 Priority class: 32 Affinity: f . 2 Id: 17a4.aac Suspend: 1 Teb: 7ffdd000 UnfrozenPriority: 0 Priority class: 32 Affinity: f 0:002> ~00 Id: 17a4.eb4 Suspend: 1 Teb: 7ffdf000 UnfrozenStart: calc!WinMainCRTStartup (01012475) Priority: 0 Priority class: 32 Affinity: f 0:002> ~# . 2 Id: 17a4.aac Suspend: 1 Teb: 7ffdd000 UnfrozenPriority: 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,

該線程可以調度到一個進程中

也可以用~<tid>n增加暫停計數,用~<tid>m減少暫停計數,如下:

?0:002> ~0n 0:002> ~0 Id: 17a4.eb4 Suspend: 2 Teb: 7ffdf000 Unfrozen1 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 Unfrozen1 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 Unfrozen1 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 Unfrozen1 Id: 17a4.d4c Suspend: 0 Teb: 7ffde000 Unfrozen . 2 Id: 17a4.aac Suspend: 1 Teb: 7ffdd000 Unfrozen


比如我只調用一次~0n,那么主線程的引用計數變為2了,我再調用g,主線程的引用計數變為1,我們的calc是運行不起來的!

凍結狀態是調試器的狀態,在window操作系統中是不支持這個概念,對于每個被凍結的線程,調試器將記住這個狀態,并且在調試事件被處理之前增加線程的掛起計數,當調試事件被處理完畢時,掛起計數將被遞減,對應的命令為:

凍結~<tid>f

解凍~<tid>u

凍結命令數量必須和解凍命令數量相等

?

?

轉載于:https://www.cnblogs.com/hgy413/archive/2012/05/14/3693528.html

總結

以上是生活随笔為你收集整理的Windbg命令学习6(!runaway和~)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。