ASP.NET デッドロック検知機能について (4)

こんにちは。 d99 です。いよいよこのシリーズも最後の回です。 今回は前回の方法で採取したダンプファイルを解析してみましょう。ASP.NET の簡単なダンプ解析方法をご紹介します。細かいところが分からなくても「だいたいのイメージ」が分かって頂けるといいかなと思います。 ダンプ解析には、採取時にインストールした Debugging Tools for Windows に含まれる windbg というデバッガを使用します。[スタート] – [すべてのプログラム] – [Debugging Tools for Windows (x86)] – [WinDbg] を起動し、c:\dump にある .dmp ファイルをドラッグアンドドロップします。Worspace に関するダイアログには一旦 [No] と答えておいてください。 今回の場合、現象はハングアップですので、動作が止まっているスレッドを探し出すことになります。一般的な方法としては、まず各スレッドのスタックトレース、つまり関数の呼び出し履歴を表示し、この中から止まっているスレッドを探します。まずは .NET 用のデバッガエクステンションを読み込みます。以下のコマンドを入力して Enter します。 .loadby sos mscorwks その上で、全スレッドのスタックトレースを表示するコマンドは ~*k、マネージドのみの全スタックトレースは ~*e !clrstack で表示できます。しかしやってみても(シンボルを設定していない事もあり)あまり良く分からない内容が大量に出てきます。 実は、スタックトレースを見るだけでこのスレッドがハングアップしているのか、それとも単に作業を割り当てられるのを待っているなどの問題のない状態なのかを判断するには、それなりの経験が必要です。ダンプが採取できるタイミングというのは各スレッドが一瞬でも止まることができるタイミングなので、基本的にすべてのスレッドはなんらかの理由で止まっています。問題はその停止が動作の流れの中の一時的なものなのか、それとも異常なものなのかを見極める事です。それを間違うと何の問題もないスレッドをハングアップの原因とみなしてしまう事になります。 では、何か良いヒントはないのでしょうか。実は、ASP.NET の比較的シンプルな Web ページであれば、簡単な判別方法があります。先ほど読み込んだ sos デバッガエクステンションのコマンド、!threads でLockCount が 1以上 になっているスレッドは、非常にざっくりと言うと、ASP.NET ページ処理で作業中の可能性が高いスレッドです。…