windbg調試死鎖問題

操作系統對死鎖的描述如下:

所謂死鎖:是指兩個或兩個以上的進程在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。   

那麼爲什麼會產生死鎖呢?

1.因爲系統資源不足。

2.進程運行推進的順序不合適。   

3.資源分配不當。            

而產生死鎖的條件有四個:

1.互斥條件:所謂互斥就是進程在某一時間內獨佔資源。

2.請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。

3.不剝奪條件:進程已獲得資源,在末使用完之前,不能強行剝奪。

4.循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關係。

 

1)  先用!locks查看所有的線程佔用的鎖

 

這裏可以看到有三個線程正在等待三個鎖,第一個線程等待的鎖是0043a620,但被5e4這條線程佔用,第二個線程等待的鎖是0043a844,但被5dc線程佔用,

第三個線程等待的鎖是031d40d4,也被5e4線程佔用。

2)接着,我們需要查看5e4線程和5dc線程的id,具體可以通過查看工具欄中Processes and Threads,如下圖所示,5e4的線程的id53,5dc線程的id51

 

3分別輸入~53kb~51kb查看這個兩個線程的調用棧,結果如下圖所示

 

由數據可知,5e4線程正在等待一把0043a844的鎖,而5dc線程也正在等待鎖0043a620

4)結合第一步獲取的信息可知,5e4線程要去獲取已經被5dc佔用的鎖0043a844,而5dc又要去獲取已經被5e4佔用的鎖0043a620,如此形成環路,就產生了死鎖

 

 

以上幾步就是分析死鎖的幾個關鍵步驟

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章