有沒有一種工具可以分析.NET代碼並找到競爭條件?找到競爭條件/死鎖的C#/。NET分析工具
我有一些代碼具有獲取或創建私有靜態字段的公共靜態屬性。它也有一個公共的靜態方法,將這個字段設置爲空(...是的,我知道!)
由於這些方法都沒有鎖定,所以事情會很糟糕在未來錯誤。我需要一個工具,遞歸地通過調用這些方法之一的東西,看看是否有任何東西在另一個線程上產生。
我正在尋找一個工具或nDepend SQL腳本(如果這是可能的話)。
有沒有一種工具可以分析.NET代碼並找到競爭條件?找到競爭條件/死鎖的C#/。NET分析工具
我有一些代碼具有獲取或創建私有靜態字段的公共靜態屬性。它也有一個公共的靜態方法,將這個字段設置爲空(...是的,我知道!)
由於這些方法都沒有鎖定,所以事情會很糟糕在未來錯誤。我需要一個工具,遞歸地通過調用這些方法之一的東西,看看是否有任何東西在另一個線程上產生。
我正在尋找一個工具或nDepend SQL腳本(如果這是可能的話)。
你可能尋找其中之一:
注意:這個答案是從2010年開始與所有建議的答案,建議往往會隨着時間而改變。現在可能還有其他產品,作爲微軟研究實驗室項目的CHESS可能已經演變成最終產品或完全被廢棄。請用一粒鹽來回答這個問題,並對現在適用的產品進行新的研究。
謝謝Lasse, 我聽說過CHESS,但沒有TypeMock Racer。 我真的在尋找一個能夠對代碼進行靜態分析的工具。我使用ReSharper 5,它具有很好的功能,可以檢查代碼並顯示特定方法的所有調用者,並遞歸地遍歷它們。我需要的是將方法標記爲在工作線程上實例化的東西。我會在CQL方法上進行更多的調查,因爲我知道有一個上游調用者腳本,所以我確定有一種方法可以確定是否有任何方法是線程調用調用的結果。 – 2010-03-04 14:00:13
這[國際象棋之叉](https://github.com/LeeSanderson/Chess)似乎是最新的並且正在工作。 – zejuel 2018-02-22 16:40:03
您可能想查看CHESS。
Jinx會在運行時執行此操作(不是靜態),但它可能值得一看。
不錯。運行時分析遠遠優於併發問題的靜態分析。對於靜態分析儀來說,運行時慣例太多以產生良好的信噪比。 – 2010-03-04 14:25:28
看起來像Jinx是烤麪包。 – tofutim 2016-08-18 03:04:26
Wikipedia:Jinx是一個併發調試器,它確定性地控制處理器內核之間的工作負載交叉,專注於共享內存交互。使用這種確定性方法,Jinx旨在增加難以捉摸的共享內存錯誤(有時稱爲Heisenbugs)的發生頻率。 Jinx不再可用。正在開發Jinx的公司Corensic被F5 Networks收購,Jinx項目被取消。 – tofutim 2016-08-18 03:06:00
你看過Red-Gate Ants?我不知道這是否會做你需要的一切,但它是一個好產品:
查看答案在這裏:What static analysis tools are available for C#?
一些靜態分析工具可以進行死鎖檢測。
此外,請嘗試從Microsoft微軟的FxCop。
我一直在試驗如何輕鬆跟蹤這些。我一直在努力追蹤一些死鎖,特別是在使用許多不同鎖定語句的情況下。
我的目標是在發生死鎖之前檢測死鎖,例如,如果您有兩個資源,則必須始終以相同的順序使用它們,否則可能會發生的死鎖。
lock (lockObj1)
lock (lockObj2)
{
// some code
}
...在應用程序別的地方...
lock (lockObj2)
lock (lockObj1) // <- I expect some "possible deadlock" detection here
{
// some code
}
在這種情況下,我在一個地方使用lockObj1然後lockObj2並在另一個地方以相反的順序使用它們,這一點你會喜歡以避免在應用程序 當然,不需要鎖陳述後,其他使用一個類似的例子,你的複雜的應用程序可能會與對方
交互的幾個複雜的對象我已經上傳的代碼與測試用例這裏 https://github.com/glmnet/LockTracer
這是一個非常有趣的想法。受你的代碼的啓發,我寫了類似的東西,給每個鎖分配一個「優先級編號」,然後檢查每當我得到多個鎖時,我按照「優先順序」得到它們。果然,這立即表明我的程序中有一個地方違反了我自己對鎖定購買順序的規則,並修復了這個問題修復了我的死鎖漏洞。 – RenniePet 2015-09-15 23:09:52
看起來更簡單但有效!你可以在GitHub上分享嗎?如果沒有,請不要忘記加註。謝謝! – 2015-09-16 12:17:04
oooh,真的有幫助John,你的意思是所有那些圍繞廣告的廣告?如果你說*哪個*廣告,或者剛剛提到它是廣告的產品或公司,這可能會有很大幫助。或者,那只是「如果你看看網站......」? – 2010-03-04 13:39:28