troushoo

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

  1. --/--/--(--) --:--:--|
  2. スポンサー広告

[Psscor2/Psscor4]!DumpAllExceptions

Psscor2/Psscor4で使用できるコマンド!DumpAllExceptionsを記述します。
!DumpAllExceptionsを利用すると、マネージヒープ上の例外情報(System.Exceptionを継承するオブジェクト)の情報を簡単に確認することができ、ダンプ解析等に威力を発揮します。

サンプルアプリ
以下のサンプルアプリを使用します。
ユーザーにintの変数を入力してもらう単純なアプリです。不正な値を5回入力したら、エラーメッセージを出力し終了します。

class Program
{
    static int input;
    static bool MyFunc()
    {
        int counter = 0;
        while (counter < 5) 
        {
            try
            {
                input = int.Parse(Console.ReadLine()); //ユーザー入力をintに変換
                return true;
            }
            catch
            {
                counter++; // 例外が発生したらcounterをアップ
            }
        }
        return false;
    }
    static void Main(string[] args)
    {
        if (!MyFunc())
        {
            MessageBox.Show("不正な値が入力されました");
        }
        else
        {
            Console.WriteLine(input);
        }
    }
}
以下は、不正な値(ここでは'a')を5回入力したときのスクリーンショットです。

!DumpAllExceptionsの実行例
ユーザーに、上記のメッセージボックスが表示されているときにダンプをとってもらい、送ってもらいます。
(ダンプ取得時に、サンプルアプリが64ビットOS上の32ビットプロセスとして動いているときは注意が必要です。その際は以前のブログをご参照ください。)
WinDbgでダンプを開き、シンボルとpsscor2/psscor4を読み込みます。

0:000> .symfix C:\dbg(x86)\sym
0:000> .reload
..............................................
0:000> .load C:\dbg(x86)\Psscor4\psscor4.dll (.NET 4の場合)

ダンプ取得時にカレントスレッド上に例外情報はないので、!PrintExceptionでは有益な情報は確認できません。

0:000> !PrintException
There is no current managed exception on this thread

そこで、!DumpAllExceptionsを実行し、ヒープ上の例外情報を表示します。複数のタイプが表示されていますが、調査の観点からは通常無視していいものもあります。(後述します。)

0:000> !DumpAllExceptions
Going to dump the .NET Exceptions found in the heap.
Loading the heap objects into our cache.
Number of exceptions of this type:        1
Exception MethodTable: 7190fd68
Exception object: 02351120
Exception type:   System.ExecutionEngineException
Message:          <none>
InnerException:   <none>
StackTrace (generated):
<none>
StackTraceString: <none>
HResult: 80131506
-----------------

Number of exceptions of this type:        1
Exception MethodTable: 7190fd1c
Exception object: 023510cc
Exception type:   System.StackOverflowException
Message:          <none>
InnerException:   <none>
StackTrace (generated):
<none>
StackTraceString: <none>
HResult: 800703e9
-----------------

Number of exceptions of this type:        1
Exception MethodTable: 7190fcd0
Exception object: 02351078
Exception type:   System.OutOfMemoryException
Message:          <none>
InnerException:   <none>
StackTrace (generated):
<none>
StackTraceString: <none>
HResult: 8007000e
-----------------

Number of exceptions of this type:        1
Exception MethodTable: 7190fb8c
Exception object: 02351024
Exception type:   System.Exception
Message:          <none>
InnerException:   <none>
StackTrace (generated):
<none>
StackTraceString: <none>
HResult: 80131500
-----------------

Number of exceptions of this type:        2
Exception MethodTable: 7190fdb4
Exception object: 02351174
Exception type:   System.Threading.ThreadAbortException
Message:          <none>
InnerException:   <none>
StackTrace (generated):
<none>
StackTraceString: <none>
HResult: 80131530
-----------------

Number of exceptions of this type:        5
Exception MethodTable: 7190b044
Exception object: 0235cf68
Exception type:   System.FormatException
Message:          入力文字列の形式が正しくありません。
InnerException:   <none>
StackTrace (generated):
*** WARNING: Unable to verify checksum for mscorlib.ni.dll
    SP       IP       Function
    0028EF50 7215AA57 mscorlib_ni!System.Number.StringToNumber(System.String, System.Globalization.NumberStyles, NumberBuffer ByRef, System.Globalization.NumberFormatInfo, Boolean)+0x92450b
    0028EF78 718364E8 mscorlib_ni!System.Number.ParseInt32(System.String, System.Globalization.NumberStyles, System.Globalization.NumberFormatInfo)+0x78
    0028F040 718215F4 mscorlib_ni!System.Int32.Parse(System.String)+0x18
    0028F04C 002F0138 DumpAllEsceptions!DumpAllEsceptions.Program.MyFunc()+0x58

StackTraceString: <none>
HResult: 80131537
-----------------

Total 11 exceptions

ここでは、System.FormatExceptionに、自分が作成したDumpAllExceptions.exeのMyFunc()から呼ばれているパスで、5つ例外がヒープ上にあることが確認できました。
またその、Messageを確認すると"入力文字列の形式がただしくありません"と表示されており、ユーザーの入力が不正であったことがわかります。

無視できうる例外について
以下の3つはの例外はプロセス起動時に作成されます。(参考URL:Using WinDbg - Hunting Exceptions)
・System.ExecutionEngineException
・System.StackOverflowException
・System.OutOfMemoryException
つまり!DumpAllExceptionsを実行した際には必ず出現します。理由は、例えばOutOfMemoryExceptionはメモリ不足時に発生する例外ですが、メモリが不足でOutOfMemoryException自体も作成できない、という状況を避けるためです。もしヒープ上に一つしかなかったら、通常時の挙動とおもって問題ありません。
また、System.Threading.ThreadAbortExceptionはcatchやfinallyがあると、事前に作られます。(参考URL:Keep Your Code Running with the Reliability Features of the .NET Framework)。Constrained Execution Regionsという信頼性向上の仕組みによるものです。

補足
・!DumpAllExceptionsを二回繰り返すと出力の結果が異なっている場合があります。
以下は!DumpAllExceptionsを実行した2回目の出力のSystem.FormatExceptionのみの部分です。Exception objectの出力が、上記の1回目の出力と変わっていることがわかります。


Number of exceptions of this type:        5
Exception MethodTable: 7190b044
Exception object: 02374e34
Exception type:   System.FormatException
Message:          入力文字列の形式が正しくありません。
InnerException:   <none>
StackTrace (generated):
    SP       IP       Function
    0028EF50 7215AA57 mscorlib_ni!System.Number.StringToNumber(System.String, System.Globalization.NumberStyles, NumberBuffer ByRef, System.Globalization.NumberFormatInfo, Boolean)+0x92450b
    0028EF78 718364E8 mscorlib_ni!System.Number.ParseInt32(System.String, System.Globalization.NumberStyles, System.Globalization.NumberFormatInfo)+0x78
    0028F040 718215F4 mscorlib_ni!System.Int32.Parse(System.String)+0x18
    0028F04C 002F0138 DumpAllEsceptions!DumpAllEsceptions.Program.MyFunc()+0x58

StackTraceString: <none>
HResult: 80131537

これは、一回目の出力は発見した例外の一つを例として表示します。二回目は、デバッガーエクステンションの内部でソートされた結果が出てくるからです。(参考URL:ASP.NET Tips: DumpAllExceptions output changes)
・!DumpAllExceptionsはヒープ上の例外を調査します。すなわちガーベッジコレクションされてなくなっている可能性もあります。
・!DumpAllExceptionsは!daeと省略することも可能です。
・!DumpAllExceptions -vとすると、typeごとにまとめて表示されず、各々がすべて表示されます。

リンク
・New Psscor2 commands – DumpAllExceptions
http://blogs.msdn.com/b/tom/archive/2010/03/30/new-psscor2-commands-dumpallexceptions.aspx
・Using WinDbg - Hunting Exceptions
http://blogs.msdn.com/b/johan/archive/2008/01/31/using-windbg-hunting-exceptions.aspx
・ASP.NET Tips: DumpAllExceptions output changes
http://blogs.msdn.com/b/tom/archive/2008/07/23/asp-net-tips-dumpallexceptions-output-changes.aspx
・Keep Your Code Running with the Reliability Features of the .NET Framework
http://msdn.microsoft.com/en-us/magazine/cc163716.aspx


  1. 2012/03/03(土) 15:44:17|
  2. SOS・Psscor2/Psscor4
  3. | トラックバック:0
  4. | コメント:0
<<Visual Studioでプロファイル(.NET メモリ割り当て) | ホーム | cURLでWindows AzureのREST API利用>>

コメント

コメントの投稿


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

トラックバック

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

スポンサーリンク

最新記事

月別アーカイブ

カテゴリ

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

全記事表示リンク

全ての記事を表示する

検索フォーム

RSSリンクの表示

リンク

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

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。