6

ダンプからNullReferenceExceptionを追跡しようとしています。NullReferenceExceptionはクラッシュ例外ではなく、クラッシュ例外はNullReferenceExceptionであるInnerExceptionを持つTargetInvocationExceptionです。

私はSOSでWindbgを使用しています。コマンドを使用する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が発生した場所は明らかではありません。

TessFerrandezのブログの指示に従おうとしました。

.Net例外-コード内のどこで例外が発生したかを追跡する

しかし、DoSomething2のIPで!ip2mdを使用してメソッドのメソッド記述子を決定しようとすると、早い段階で行き詰まりましたDoSomething2:7FF01E7C639:

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

!ip2mdコマンドは、TargetInvocationExceptionが発生したメソッドのIPで成功することに注意してください。

質問

DoSomething2のどの行がクラッシュしているのかを絞り込むために、ここからどこに行くことができますか?クラッシュを再現できないことに注意してください。そのため、この(およびいくつかの重複した)ダンプがすべてあります。

追記

  • .NET 4.0
  • Windbgバージョン:6.12.002.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 noisyをオンにすると、シンボルが正しく読み込まれるように見えます。

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ではありません」でリストされているもの)は、これが完全なミニダンプではないためだと思います。そうですか?

4

3 に答える 3

4

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

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

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

于 2012-10-02T15:53:29.977 に答える
4

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

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

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

于 2012-10-02T17:46:50.697 に答える
3

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

于 2012-10-02T18:28:11.227 に答える