web-dev-qa-db-ja.com

競合状態/デッドロックを見つけるためのC#/。NET分析ツール

.NETコードを分析して競合状態を見つけるツールはありますか?

プライベート静的フィールドを取得または作成するパブリック静的プロパティを持つコードが少しあります。また、このフィールドをnullに設定するpublic staticメソッドもあります(...はい、わかっています!..)

これらの方法のどちらにもロックがないため、将来的に事態がひどく悪くなることは間違いありません。これらのメソッドのいずれかを呼び出すものを再帰的に調べて、別のスレッドで何かが生成されたかどうかを確認するツールが必要です。

私はツールまたはおそらくnDependSQLスクリプトを探しています(これが可能な場合)。

40
Steve Dunn

あなたはおそらくこれらの1つを探しています:


[〜#〜]注[〜#〜]:この回答は2010年のものです。すべての推奨事項の回答と同様に、推奨事項は時間の経過とともに変化する傾向があります。現在、他の製品が出回っている可能性があります。MicrosoftResearchLabsのプロジェクトであったCHESSは、最終製品に進化したか、完全に廃棄された可能性があります。この答えを一粒の塩でとらえ、現在どの製品が適しているかについて新しい研究を行ってください。

20

Jinx これは実行時に(静的ではなく)実行されますが、一見の価値があるかもしれません。

4
John Gietzen

私はそれらを簡単に追跡する方法を実験してきました。私は、特に多くの異なるロックステートメントが使用されるシナリオで、いくつかのデッドロックを追跡するために取り組んできました。

私の目標は、デッドロックが発生する前にそれを検出することです。リソースが2つある場合は、常に同じ順序で使用する必要があります。そうしないと、デッドロックが発生する可能性があります

lock (lockObj1) 
lock (lockObj2) 
{ 
    // some code
} 

...アプリのどこか...

lock (lockObj2) 
lock (lockObj1) // <- I expect some "possible deadlock" detection here 
{ 
    // some code
} 

この場合、ある場所でlockObj1、次にlockObj2を使用し、別の場所でそれらを逆の順序で使用しています。これは、アプリケーションでは避けたいものです。もちろん、lockステートメントを次々に使用する必要はありません。他の例のように、複雑なアプリケーションには、相互作用する複数の複雑なオブジェクトがある場合があります

ここにテストケースを含むコードをアップロードしました https://github.com/glmnet/LockTracer

4

あなたはチェックアウトしたいかもしれません [〜#〜]チェス[〜#〜]

3
Kent Boogaart

ここで回答を参照してください: C#で使用できる静的分析ツールは何ですか?

一部の静的分析ツールは、デッドロック検出を実行できます。

また、Microsoftの FxCop を試してください。

2

Red-Gate Ants を見たことがありますか?それがあなたが必要とするすべてをするかどうかはわかりませんが、それは次のような良い製品です:

  • 数分以内にパフォーマンスのボトルネックを特定する
  • .NETアプリケーションのパフォーマンスを最適化する
  • 行レベルのタイミングでコードの遅い行にドリルダウンする
  • プロファイルaspx、ASP.NET、C#コード、およびVB.NETアプリケーション
0
Keith Barrows