2012-10-02 10 views
6

ダンプからNullReferenceExceptionを追跡しようとしています。 NullReferenceExceptionはクラッシュ例外ではなく、クラッシュする例外はNullReferenceExceptionであるInnerExceptionを持つTargetInvocationExceptionです。私はSOSとWindbgのを使用していWinDbgを使用してミニダンプからInnerExceptionの行番号を特定します

は、私はコマンドanalyze -vを使用して、これは私とNullReferenceExceptionのコールスタックできます:私はバイトオフセットとメソッド名を取得することを、

EXCEPTION_OBJECT: !pe f6cb150 
Exception object: 000000000f6cb150 
Exception type: System.NullReferenceException 
Message:   Object reference not set to an instance of an object. 
InnerException: <none> 
StackTrace (generated): 
SP    IP    Function 
000000002CD9D8C0 000007FF01E7C639 MyDll!DoSomething2()+0xe99 
000000002CD9DBE0 000007FF01E7B11D MyDll!DoSomething1()+0x43d 
000000002CD9DD20 000007FF01E7AB11 MyDll!WorkerDoWork(System.Object, System.ComponentModel.DoWorkEventArgs)+0x51 
000000002CD9DD80 000007FEEA68A0F2 System_ni!System.ComponentModel.BackgroundWorker.WorkerThreadStart(System.Object)+0x62 

お知らせを、ありません行番号。 DoSomething2は大きな関数なので、NullReferenceExceptionがどこで発生したのかは明らかではありません。

私はテスFerrandezのブログの指示に従うことを試みた:

.Net exceptions - Tracking down where in the code the exceptions occurred

しかし、私は、私が用いた方法DoSomething2ための方法の記述子を決定しようとする場所に早く捕まってしまったDoSomething2のIPとip2md! :7FF01E7C639:!ip2mdコマンドはに、TargetInvocationExceptionが発生したメソッドのIPに成功したことを

> !ip2md 7FF01E7C639 
Failed to request MethodData, not in JIT code range 

は注意してください。

質問:私はクラッシュさDoSomething2で何行絞り込むことがここから行くことができ

? 私はクラッシュを再現できないので、私はすべてこの(そしていくつかの重複した)ダンプを持っていることに注意してください。

追加メモ

  • .NET 4.0
  • Windbgのバージョン:
より良いので、より多くの情報:6.12.0002.633 AMD64
  • 私はWindbgのに新たなんです

    編集1

    私が適切に設定シンボルを持っていない場合は、私は以下のようになります!

    STACK_TEXT: 
    00000000`2cd9d8c0 00000000`ffffffff MyDll!Unknown_0xe99+0xe99 
    00000000`2cd9dbe0 00000000`ffffffff MyDll!Unknown_0x43d+0x43d 
    00000000`2cd9dd20 00000000`ffffffff MyDll!Unknown_0x51+0x51 
    00000000`2cd9dd80 00000000`ffffffff system_ni! System.ComponentModel.BackgroundWorker.WorkerThreadStart+0x62 
    

    私は私のシンボルサーバーをポイントするとオンにそれを設定するときは、ノイズの多いSYM、適切にシンボルをロードするために表示されます。

    0:000> ld MyDll 
    DBGHELP: C:\Program Files\Debugging Tools for Windows (x64)\MyDll.dll - file not found 
    SYMSRV: c:\symbols\MyDll.dll\4F3D6F4B154000\MyDll.dll not found 
    SYMSRV: http://msdl.microsoft.com/download/symbols/MyDll.dll/4F3D6F4B154000/MyDll.dll not found 
    SYMSRV: \\mysymbolserver\store\Mydll.dll\4F3D6F4B154000\file.ptr 
    SYMSRV: MyDll.dl_ from \\mysymbolserver\store: uncompressed 
    DBGHELP: c:\symbols\MyDll.dll\4F3D6F4B154000\MyDll.dll - OK 
    DBGENG: c:\symbols\MyDll.dll\4F3D6F4B154000\MyDll.dll - Mapped image memory 
    SYMSRV: c:\symbols\MyDll.pdb\8AFC2BE7529A41289FA9FBCEDB6836161\Mydll.pdb not found 
    SYMSRV: http://msdl.microsoft.com/download/symbols/Mydll.pdb/8AFC2BE7529A41289FA9FBCEDB6836161/MyDll.pdb not found 
    SYMSRV: \\mysymbolserver\store\MyDll.pdb\8AFC2BE7529A41289FA9FBCEDB6836161\file.ptr 
    SYMSRV: MyDll.pd_ from \\mysymbolserver\store: uncompressed 
    DBGHELP: MyDll - private symbols & lines 
        c:\symbols\MyDll.pdb\8AFC2BE7529A41289FA9FBCEDB6836161\MyDll.pdb 
    Symbols loaded for MyDll 
    

    編集2

    は、私が使用してみましたname2ee次のように!

    0:000> !name2ee MyDll!MyType.DoSomething2 
    Module:  000007ff004995b8 
    Assembly: Autodesk.DataManagement.Client.Framework.Vault.dll 
    <invalid module token> 
    

    だから、そこに運がない。しかし、私はほとんどこれでどこかに取得するように見えた:

    0:000> !name2ee MyDll.dll!MyNamespace.MyType 
    Module:  000007ff004995b8 
    Assembly: MyDll.dll 
    Token:  000000000200008c 
    MethodTable: 000007ff01b2e258 
    EEClass:  000007ff01b415e0 
    Name:  MyNamespace.MyType 
    
    0:000> !dumpmt -md 7ff01b2e258 
    EEClass:  000007ff01b415e0 
    Module:  000007ff004995b8 
    Name:   MyNamspace.MyType 
    mdToken:  000000000200008c 
    File:   C:\Program Files\MyCompany\MyProduct\Bin\MyDll.dll 
    BaseSize:  0x30 
    ComponentSize: 0x0 
    Slots in VTable: 31 
    Number of IFaces in IFaceMap: 2 
    -------------------------------------- 
    MethodDesc Table 
          Entry  MethodDesc  JIT Name 
    000007feeb31a2c0 0000000000000000  NONE 0000000000000000 is not a MethodDesc 
    000007feeb3689f0 0000000000000000  NONE 0000000000000000 is not a MethodDesc 
    000007feeb3688c0 0000000000000000  NONE 0000000000000000 is not a MethodDesc 
    000007feeb353440 0000000000000000  NONE 0000000000000000 is not a MethodDesc 
    000007ff01b01300 0000000000000000  NONE 0000000000000000 is not a MethodDesc 
    000007ff01e89140 0000000000000000  NONE 0000000000000000 is not a MethodDesc 
    000007ff01b9c080 0000000000000000  NONE 0000000000000000 is not a MethodDesc 
    000007ff01f45f40 0000000000000000  NONE 0000000000000000 is not a MethodDesc 
    000007ff01a9b358 000007ff01b2e128  NONE MyType.DoSomething3() 
    000007ff01a9b360 000007ff01b2e130  NONE MyType.DoSomething4() 
    000007ff01a9b368 000007ff01b2e138  NONE MyType.DoSomething5() 
    000007ff01e79800 0000000000000000  NONE 0000000000000000 is not a MethodDesc 
    000007ff020fea80 0000000000000000  NONE 0000000000000000 is not a MethodDesc 
    000007ff01a9b3b0 000007ff01b2e1b0  NONE MyType.DoSomething6() 
    000007ff01a9b3b8 000007ff01b2e1b8  NONE MyType.DoSomething7() 
    000007ff01a9b328 000007ff01b2e0f0  NONE MyType..ctor() 
    000007ff01b01280 0000000000000000  NONE 0000000000000000 is not a MethodDesc 
    000007ff01e7a810 0000000000000000  NONE 0000000000000000 is not a MethodDesc 
    000007ff01e7aac0 0000000000000000  NONE 0000000000000000 is not a MethodDesc 
    000007ff01e83240 0000000000000000  NONE 0000000000000000 is not a MethodDesc 
    000007ff01f19520 000007ff01b2e178  JIT MyType.RunWorkerCompleted(System.Object, System.ComponentModel.RunWorkerCompletedEventArgs) 
    000007ff01e7ace0 0000000000000000  JIT 0000000000000000 is not a MethodDesc 
    000007ff01e7b7a0 0000000000000000  JIT 0000000000000000 is not a MethodDesc 
    000007ff01e7b710 0000000000000000  JIT 0000000000000000 is not a MethodDesc 
    000007ff01e7d2b0 0000000000000000  JIT 0000000000000000 is not a MethodDesc 
    000007ff01b015f0 0000000000000000  JIT 0000000000000000 is not a MethodDesc 
    000007ff01b88ce0 0000000000000000  JIT 0000000000000000 is not a MethodDesc 
    000007ff01a9b3e0 000007ff01b2e200  NONE MyType.DoSomething8() 
    000007ff01b921e0 0000000000000000  NONE 0000000000000000 is not a MethodDesc 
    000007ff01b933b0 0000000000000000  NONE 0000000000000000 is not a MethodDesc 
    000007ff01b93870 0000000000000000  NONE 0000000000000000 is not a MethodDesc 
    

    私は不足しているすべてのエントリ(「MethodDescではありません」と記載されているもの)が、これは完全なミニダンプされていないに起因している推測しています。そうですか?

  • +0

    管理スタックトレースを取得するためのシンボルは必要ありません。しかし、通常は完全ダンプが必要です。これはプロセスの完全なダンプかミニダンプか? –

    +0

    はい、欠落したエントリは、ダンプがいっぱいではないことが原因です。 –

    答えて

    3

    上記のコメントでは、||コマンドは「ユーザーミニダンプ」を生成します。 .NETコードを正しくデバッグするには、フル・ダンプが必要です。これは、||コマンド。私はこれがあなたの問題だと思う。フルローダーヒープにアクセスできない場合は、コードアドレスを.NETメソッドに戻すことができないため、スタックトレースを取得できません。この問題を再現できる場合は、完全ダンプを取得してください。 ADPlus、ProcDump、またはDebugDiagを使用して、クラッシュ時にダンプをキャプチャできます。

    4

    WinDbgがDLLのシンボルを取得しないようです。シンボルパスを設定し、!sym noisyを使用して、必要に応じてトラブルシューティングを行うことで、それを調べることができます。

    この場合、!ip2mdが機能しない理由はわかりませんが、DoSomething2のコードを取得する他の方法があります。メソッド名に!name2eeを入力してください。 !name2ee *!TypeName.DoSomething2または!name2ee *!Namespace.TypeNameのようなタイプ自体で取得し、次に!name2eeから取得するメソッドテーブルの!dumpmt -md <method table>を取得できます。

    コードを取得したら、!uコマンドを実行すると、アセンブリコードの.NET注釈付きダンプが表示されます。例外からのオフセットを使用すると、NullReferenceExceptionの性質を判断できる場合があります。

    +0

    ありがとう!私はシンボルが読み込まれていると思った。記号がなければ、私は別の出力を得る(質問の私の編集を参照)。私はすぐに代替方法を試してみて、報告して戻します。 –

    +0

    ダンプが完全なダンプでない場合、ほとんどの.NETデバッグコマンドは機能しません。それがここに当てはまるのだろうか? –

    +0

    @SteveJohnson、これが完全なダンプであるかどうかを私に伝える方法はありますか? !ip2mdコマンドは、最終クラッシュが発生した場所の関数の記述子を取得するために機能します。 –

    4

    リリースビルドでプロジェクト用に生成されたデフォルトのPDBファイルが使用されている可能性があります。すべてのファイルと行番号情報は、そのようなファイルから削除されます。

    リリース設定、プロジェクト+プロパティ、ビルドタブ、詳細、デバッグ情報= "フル"に切り替えます。

    これは意図的なbtwです。リリースビルドの行番号情報はあまり正確ではありません。ジッタオプティマイザはコードを移動するので、表示される行番号は近似値であることに注意する必要があります。

    関連する問題