troushoo

[Psscor2/Psscor4]!SyncBlk: デッドロックの調査

Psscor2/Psscor4で使用できるコマンド!SyncBlkについて記述します。
このコマンドを使用すると、アプリのデッドロックの調査の解決につながりえます。

今回使用するアプリ
デッドロックを起こす典型的なアプリを使用します。(こちらのコードをもとに、少し改良しました。)
このアプリはlock()を用いてデッドロック状態になります。(コード自身は、今回は重要ではありません。)

using System;
using System.Threading;
 
namespace MyDeadLock
{
    class Program
    {
        static readonly object firstLock = new object();
        static readonly object secondLock = new object();
 
        static void ThreadJob()
        {
            lock (firstLock)
            {
                Console.WriteLine("\t\t\t\tfirstLockをロック完了");
                Thread.Sleep(1000);
                Console.WriteLine("\t\t\t\tsecondLockのロック解除待ち");
                lock (secondLock)
                {
                    Console.WriteLine("\t\t\t\tsecondLockのロック完了");
                }
            }
        }
 
        static void Main(string[] args)
        {
            new Thread(new ThreadStart(ThreadJob)).Start();
            Thread.Sleep(1000);
            lock (secondLock)
            {
                Console.WriteLine("secondLockをロック完了");
                Console.WriteLine("firstLockのロック解除待ち");
                lock (firstLock)
                {
                    Console.WriteLine("firstLockのロック完了");
                }
            }
        }
    }
}

上記のコードを実行すると、以下のような画面になりこれ以上先に進みません。
デッドロック時のスクリーンショット
この状態を図示すると以下のようにデッドロック状態になっています。
デッドロック
今回は、このアプリがデッドロック状態になっている時のダンプを取得し、デットロック状態になっていることをPsscorを使用してダンプ解析を行います。

ダンプ解析手順
1. ダンプの取得
上記のアプリを使用し、デッドロック状態になっているときのダンプを取得します。
ダンプは、タスクマネージャーから取得可能です。詳細は、以前のブログをご参照ください。
ダンプファイルの作成
2. WinDbgで作成したダンプを開きます。
ダンプファイルのオープン
3. シンボルの設定、psscor2・psscor4の読み込みを行います。
シンボルの設定・psscorの読み込み
4. !syncblkコマンドを実行します。
結果は以下のようになります。
!syncblk
出力の一行目より、ID3のスレッド図中①のSystem.Objectをロックしており、また図中①のSystem.Objectを待っているスレッドがID0のスレッドであることがわかります。
同様に出力の二行目より、ID0のスレッド図中②のSystem.Objectをロックしており、また図中②のSystem.Objectを待っているスレッドがID3のスレッドであることがわかります。
これを図示すると、以下のようになり、デッドロックが起こっていることがわかります。
デッドロック

補足
・sos.dllの!syncblk
sos.dllにも!syncblkコマンドはあるのですが、Waiting threadsが表示されません。
したがってpsscorのほうが良いです。
sos.dllの!syncblkの結果
・psscor4の!syncblk
ウィンドウズアップデートを最新の状態にした環境でEXEを動かし・ダンプを取得し、psscor4の!syncblkを実行すると、Error requesting SyncBlk dataと表示され、結果が取得できませんでした。
Error requesting SyncBlk data
ただし、Windows 7に、こちらよりダウンロードした.NET Framework 4のみをインストールした環境でEXEを動かし・ダンプを取得し、そのダンプに対して!syncblkを実行すると、問題なく結果が取得できました。
psscor4の!syncblk

リンク
・A Hang Scenario, Locks and Critical Sections
http://blogs.msdn.com/b/tess/archive/2006/01/09/a-hang-scenario-locks-and-critical-sections.aspx


 


 

 

 

  1. 2012/08/02(木) 09:14:11|
  2. SOS・Psscor2/Psscor4
  3. | トラックバック:0
  4. | コメント:0
<<Visual Studio 2012の新機能: 並列ウォッチ | ホーム | Process Monitorのインストールからチィップスまで (3)>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://troushoo.blog.fc2.com/tb.php/70-d944afb5
この記事にトラックバックする(FC2ブログユーザー)

スポンサーリンク

最新記事

月別アーカイブ

カテゴリ

ツール (92)
ネットワーク (76)
Visual Studio (56)
SOS・Psscor2/Psscor4 (25)
WinDbg (25)
Linux (24)
Azure (17)
Tips (20)
英語 (1)
About Me (1)
未分類 (0)

全記事表示リンク

全ての記事を表示する

検索フォーム

RSSリンクの表示

リンク

このブログをリンクに追加する