troushoo

[sos]!Threads:マネージスレッドの情報表示

WinDbg等で使用できる.NET用のデバッガエクステンションsosで、マネージスレッドの情報を表示する!Threadsについて記述します。

今回使用するアプリ
以下のサンプルアプリ(=Threads.exe)を起動すると、CPUが高負荷になるという現象になります。原因は、MyClassのファイナライザで高負荷な処理をするためです。
この調査をCPUが高負荷時のダンプを取得し、!Threadsコマンドを用いて、原因はファイナライザにある、というところまで持っていきたいと思います。

class MyClass
{
    ~MyClass()
    {
        //高負荷処理をするデストラクタ
        //式自体に意味はありません。
        long l1 = 1; long l2 = 1; long l3 = 0;
        while (true)
        {
            l3 = l1 * l2; l1 = l3; l2 = (l3 + l1) * l2;
        }
    }
}
 
class Program
{
    static public void MyFunc()
    {
        MyClass mc = new MyClass();
    }
 
    static void Main(string[] args)
    {
        MyFunc();
        //ここで、強制的にガーベッジコレクタを行い
        //~MyClass()を実行させる。
        GC.Collect();
 
        //わかりやすさのためMainスレッドを終了させないためのループ
        while(true){Thread.Sleep(2000);}
    }
}

ダンプ調査
1. CPU高負荷時のダンプを取得します。
(補足) 32bitの.NETアプリのダンプを取るには32bitのタスクマネージャーでダンプを取る必要があります。詳細は、以前のブログ: .NETの64bit OS上の32bitプロセスのダンプの取得方法をご参照ください。


2. WinDbgでダンプを開きます。
(補足).NETの32bitアプリのダンプは、32ビットのWinDbgで開く必要があります。

3. !runawayコマンドを実行します。
!runawayコマンドは現在実行中のすべてのスレッドとそのCPU使用率を表示してくれます。(!runawayはsos.dllのコマンドではありません。)
0:000> .symfix c:\sym
0:000> .reload
...........................
0:000> !runaway
User Mode Time
  Thread       Time
   2:d84       0 days 0:00:16.177
   3:df0       0 days 0:00:00.000
   1:d80       0 days 0:00:00.000
   0:e08       0 days 0:00:00.000
上記の結果より、スレッド2でCPU使用率が高いことがわかります。
4. !Threadsコマンドを実行します。
0:000> .loadby sos clr
0:000> !Threads
ThreadCount:      2
UnstartedThread:  0
BackgroundThread: 1
PendingThread:    0
DeadThread:       0
Hosted Runtime:   no
                                       PreEmptive   GC Alloc                Lock
ID  OSID ThreadOBJ    State GC           Context       Domain   Count APT Exception
0    1   e08 003ce588   200a020 Enabled  00000000:00000000 003c7b38     0 MTA
2    2   d84 003da188      b220 Disabled 00000000:00000000 003c7b38     0 MTA (Finalizer)
上記よりスレッド2はFinalizerの状態であることがわかります。

リンク
・MSDNによる!Threads含むsos.dllの説明
http://msdn.microsoft.com/en-us/library/bb190764.aspx


  1. 2012/04/29(日) 14:14:03|
  2. SOS・Psscor2/Psscor4
  3. | トラックバック:0
  4. | コメント:0
<<Windows Azureストレージに対してVisual StudioのWebパフォーマンステストの実行 | ホーム | ILSpy 2.0で.NETアプリケーションのデコンパイル>>

コメント

コメントの投稿


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

トラックバック

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

スポンサーリンク

最新記事

月別アーカイブ

カテゴリ

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

全記事表示リンク

全ての記事を表示する

検索フォーム

RSSリンクの表示

リンク

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