除此之外,我不知道現在是否可以重現它(我已經使用這個特定的應用程序一兩個星期沒有問題),假設我在VS調試器中運行我的應用程序在發生這種情況後,我應該如何去調試死鎖?如果我暫停了程序,並且看到了不同線程發生的位置,我想我可能能夠訪問調用堆棧,但單擊暫停也會導致Visual Studio陷入僵局,直到我殺死了我的應用程序。如何調試死鎖?
除瀏覽我的源代碼樹以查找潛在問題外,還有其他方法嗎?一旦問題出現後,有沒有辦法讓調用堆棧看到問題出在哪裏?任何其他工具/技巧/竅門可能有幫助?
除此之外,我不知道現在是否可以重現它(我已經使用這個特定的應用程序一兩個星期沒有問題),假設我在VS調試器中運行我的應用程序在發生這種情況後,我應該如何去調試死鎖?如果我暫停了程序,並且看到了不同線程發生的位置,我想我可能能夠訪問調用堆棧,但單擊暫停也會導致Visual Studio陷入僵局,直到我殺死了我的應用程序。如何調試死鎖?
除瀏覽我的源代碼樹以查找潛在問題外,還有其他方法嗎?一旦問題出現後,有沒有辦法讓調用堆棧看到問題出在哪裏?任何其他工具/技巧/竅門可能有幫助?
你所做的是正確的方法。如果Visual Studio也發生死鎖,那麼現在和現在都會發生。這只是運氣不好,除非有其他問題。
您不必在調試器中運行應用程序來調試它。通常運行應用程序,如果發生死鎖,可以稍後連接VS。 Ctrl + Alt + P,選擇進程,選擇調試器類型並點擊附加。使用一組不同的調試器類型可能會降低VS崩潰的風險(特別是如果您不調試本機代碼)
死鎖涉及2個或更多線程。您可能知道第一個(可能是您的UI線程),因爲您注意到了應用程序中的死鎖。現在你只需要找到另一個。隨着架構的知識,應該很容易找到(如什麼其他的線程使用相同的鎖,與UI交互等)
如果VS完全不工作,你可以隨時使用WinDbg的 。在這裏下載:http://www.microsoft.com/whdc/devtools/debugging/default.mspx
您可以使用不同的程序,如英特爾(R)Parallel Inspector中:
http://software.intel.com/en-us/intel-parallel-inspector/
這樣的程序可以告訴你在你的代碼的地方有潛在的死鎖。但是您應該爲此付費,或者僅使用評估期。不知道是否有這樣的免費工具。
我想嘗試不同的方法按以下順序:
- 首先,檢查代碼查找線程安全的違法行爲,確保你的關鍵區域不調用等功能,將依次嘗試鎖定關鍵區域。
- 使用任何您可以親自操作的工具來可視化線程活動,我使用內部perl腳本來分析我們製作的操作系統日誌,並繪製所有上下文切換,並顯示線程被搶佔時的情況。
- 如果找不到好的工具,請執行一些日誌記錄以查看死鎖發生前正在運行的最後一個線程。這將爲您提供有關問題可能出現的位置的線索,如果鎖定機制具有唯一的名稱(如對象具有自己的線程),則創建專用的信號量或互斥量來管理該線程會有所幫助。
我希望這會有所幫助。祝你好運!
關於日誌記錄,我確實需要學習如何正確使用log4net ... – 2009-07-18 13:01:44
就像任何地方一樣,沒有「銀色子彈」工具來捕捉所有的死鎖。這是關於不同線程獲取資源的順序,因此您的工作是查明訂單被違反的位置。通常Visual Studio或其他調試器將提供堆棧跟蹤,您將能夠找出差異在哪裏。 DevPartner Studio確實提供了死鎖分析,但上次我檢查了太多的誤報。一些靜態分析工具也會發現一些潛在的死鎖。
除此之外,它有助於讓架構直接執行資源採購訂單。例如,分層有助於確保上層鎖定在低層鎖定之前進行,但要小心回調。
它似乎只適用於C/C++(非管理我假設,因爲沒有託管C據我所知)。 – 2009-07-18 12:34:28