C# lock 死鎖問題排查方法

  • 2020 年 9 月 30 日
  • 筆記

多執行緒程式發生死鎖,某些重要執行緒卡住,不正常工作。排查起來非常麻煩。以下內容記錄排查方法

1.確定死鎖的位置,一般死鎖會lock到某一行具體的程式碼,比如我就死鎖在類似如下程式碼中

        public void SendSerialportMsg()
        {
            lock(this) //死鎖
            {
                //..
            }
        }

具體定位死鎖位置的方法:運行模式下,visual studio–調試–窗口–執行緒,底下欄目會多出一欄執行緒視圖。

點擊程式暫停運行按鈕,在打開執行緒視圖,就能看到所有的執行緒列表。找到你認為發生死鎖的那條執行緒,右鍵切換到執行緒,程式就能自動跳轉到死鎖那一行程式碼,如下類似

 

 

 2、已經找到死鎖位置了,首先如果比較簡單,先人工review一下,看看能不能找到死鎖問題

3、如果不能簡單解決。那可以嘗試,給可能產生死鎖的執行緒加上執行緒名,便於辨認。然後,修改死鎖位置程式碼如下

        Thread lastThread=null;
        public void SendSerialportMsg()
        {
            lastThread = Thread.CurrentThread;
            lock (this)  //死鎖位置
            {
                lastThread = Thread.CurrentThread;
                //..
            }
        }

4、再重現一次死鎖。定位到死鎖行,然後展開lastThread,看該執行緒運行在那裡卡住,以致於後續執行緒不能響應。然後排查lastThread的阻塞問題。Done!!!