windbg調試命令7(!runaway、~)

來源:互聯網
上載者:User
windbg調試命令7(!runaway、~)

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,

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

也可以用~<tid>n增加暫停計數,用~<tid>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作業系統中是不支援這個概念,對於每個被凍結的線程,調試器將記住這個狀態,並且在調試事件被處理之前增加線程的掛起計數,當調試事件被處理完畢時,掛起計數將被遞減,對應的命令為:

凍結~<tid>f

解凍~<tid>u

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.