2012-10-02 7 views
6

Ich versuche, eine NullReferenceException von einem Dump zu finden. Die NullReferenceException ist nicht die Absturzausnahme, sondern die Absturzausnahme ist eine TargetInvocationException mit einer InnerException, bei der es sich um die NullReferenceException handelt.Bestimmen der Zeilennummer von InnerException von Minidump mit WinDbg

ich Windbg mit SOS bin mit, verwende ich das den Befehl analyze -v und das gibt mir den Call-Stack des 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 

Hinweis, dass ich die Methodennamen mit Byte-Offsets, aber keine Linien Nummern. DoSomething2 ist eine große Funktion, daher ist es nicht offensichtlich, wo die NullReferenceException aufgetreten ist.

ich versuchte, die Anweisungen in Tess Ferrandez Blog zu folgen:

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

Aber ich habe schon früh fest, wo ich versuchen, das Verfahren Beschreibung für das Verfahren mit dem IP von DoSomething2 DoSomething2 mit ip2md zu bestimmen! 7FF01E7C639:

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

Beachten Sie, dass die ip2md Befehl auf die IP des Verfahrens gelingt es, wo die TargetInvocationException aufgetreten!.

Frage:

Wo kann ich von hier aus gehen zu verengen, was Linie in DoSomething2 abstürzt? Beachten Sie, dass ich den Absturz nicht reproduzieren kann, also alles, was ich habe (und mehrere doppelte) Dumps.

Zusätzliche Hinweise:

  • .NET 4.0
  • Windbg Version: 6.12.0002.633 AMD64
  • Ich bin neu in Windbg: je mehr Informationen, desto besser

Bearbeiten 1

Wenn ich Symbole nicht richtig eingerichtet haben, bekomme ich folgendes:

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 

Wenn ich es bis zu meinem Symbol Server zu verweisen, und schalten Sie sym laut, scheint es, Symbole richtig zu laden:

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 

Edit 2

ich versucht, mit name2ee wie folgt:

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

Also, kein Glück dort.Aber dann schien ich fast irgendwo zu bekommen mit diesem:

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 

Ich vermute, alle fehlenden Einträge (die aufgeführten mit „kein MethodDesc“) sind aufgrund dieser keine vollständige Mini-Dump zu sein. Ist das richtig?

+0

Sie sollten keine Symbole benötigen, um eine verwaltete Stack-Trace zu erhalten. In der Regel benötigen Sie jedoch einen vollständigen Speicherauszug. Ist das eine vollständige Dump des Prozesses oder nur ein Mini-Dump? –

+0

Ja, die fehlenden Einträge werden höchstwahrscheinlich dadurch verursacht, dass der Dump nicht voll ist. –

Antwort

3

In einem Kommentar oben erwähnen Sie, dass die || Befehl ergibt "User mini dump". Um .NET-Code ordnungsgemäß zu debuggen, benötigen Sie einen vollständigen Speicherauszug, der "Vollspeicher-Benutzer-Minidump" aus dem || anzeigen würde Befehl. Ich denke, das ist dein Problem. Ohne Zugriff auf die vollständigen Loader-Heaps ist es nicht möglich, eine Codeadresse einer .NET-Methode zuzuordnen, sodass Sie keine Stack-Trace abrufen können. Wenn Sie dieses Problem reproduzieren können, erfassen Sie einen vollständigen Speicherauszug. Sie können ADPlus, ProcDump oder DebugDiag verwenden, um bei einem Absturz einen Dump zu erfassen.

4

Es sieht aus wie WinDbg Symbole für Ihre DLL nicht abholen. Sie können dies überprüfen, indem Sie den Symbolpfad festlegen und !sym noisy zur Fehlerbehebung verwenden.

Ich kann nicht sagen, warum !ip2md in diesem Fall nicht funktioniert, aber es gibt andere Möglichkeiten, den Code für DoSomething2 zu erhalten. Versuchen Sie !name2ee für den Methodennamen, z. !name2ee *!TypeName.DoSomething2 oder Sie können es über den Typ selbst erhalten wie diese !name2ee *!Namespace.TypeName und dann !dumpmt -md <method table> auf die Methodentabelle, die Sie von !name2ee erhalten.

Sobald Sie den Code haben, kann der Befehl !u Ihnen einen mit .NET kommentierten Dump des Assembly-Codes anzeigen. Mithilfe des Offsets der Ausnahme können Sie möglicherweise die Art der NullReferenceException ermitteln.

+0

Danke! Ich dachte, ich hätte Symbole geladen. Ohne Symbole erhalte ich unterschiedliche Ausgaben (siehe meine Änderungen in der Frage). Ich werde bald die alternativen Methoden ausprobieren und darüber berichten. –

+0

Die meisten .NET-Debugging-Befehle funktionieren nicht, wenn der Dump kein vollständiger Dump ist. Ich frage mich, ob das hier der Fall ist? –

+0

@SteveJohnson, gibt es eine Möglichkeit für mich zu sagen, ob dies eine vollständige Dump ist oder nicht? Der! ip2md-Befehl funktioniert, um den Methodendeskriptor der to-Funktion abzurufen, in der der endgültige Absturz aufgetreten ist. –

4

Sie verwenden wahrscheinlich eine abgestreifte PDB-Datei, die standardmäßig für ein Projekt im Release-Build erstellt wurde. Alle Datei- und Zeilennummerninformationen werden aus einer solchen Datei entfernt.

Wechseln Sie in die Release-Konfiguration, Projekt + Eigenschaften, Registerkarte Erstellen, Erweitert, Debug Info = "full".

Dies ist beabsichtigt BTW, Zeilennummer Info ist nicht sehr genau für den Release-Build. Der Jitter-Optimierer bewegt den Code herum, so dass Sie daran denken müssen, dass eine angezeigte Zeilennummer eine Annäherung ist.

Verwandte Themen