2012-10-02 4 views
6

Sto provando a rintracciare una NullReferenceException da un dump. NullReferenceException non è l'eccezione di arresto anomalo, piuttosto l'eccezione di arresto anomalo è una TargetInvocationException con InnerException che è NullReferenceException.Determinare il numero di riga di InnerException da minidump utilizzando WinDbg

sto utilizzando Windbg con il SOS, io uso il comando analyze -v e questo mi dà lo stack di chiamate del 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 

Avviso, che ho i nomi dei metodi con scostamenti di byte, ma non numeri di linea. DoSomething2 è una funzione di grandi dimensioni, quindi non è ovvio dove si è verificata NullReferenceException.

ho cercato di seguire le istruzioni contenute nel blog di Tess Ferrandez:

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

Ma sono rimasto bloccato nella fase iniziale in cui si tenta di determinare il descrittore di metodo per il metodo DoSomething2 utilizzando ip2md con l'IP di DoSomething2! : 7FF01E7C639:

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

Nota che il comando ha esito positivo ip2md sul IP del metodo in cui si è verificato l'TargetInvocationException!.

Domanda:

Dove posso andare da qui a restringere quale linea in DoSomething2 si blocca? Si noti che non riesco a riprodurre l'arresto anomalo, quindi tutto ciò che ho questo (e diversi doppioni) dump.

Note aggiuntive:

  • .NET 4.0
  • Windbg Versione: 6.12.0002.633 AMD64
  • Sono nuovo di Windbg: quindi più informazioni, il meglio

Modifica 1

quando non mi hanno simboli impostato correttamente, ottengo il seguente:!

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 

Quando ho impostato per puntare al mio server di simboli e accendere Sym rumorosa, sembra per caricare i simboli correttamente:

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

ho provato ad utilizzare name2ee come segue:!

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

Quindi, nessuna fortuna lì.Ma poi ho quasi sembrava di arrivare da qualche parte con questo:

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 

Sto indovinando tutte le voci mancanti (quelli elencati con "non è un methoddesc") sono dovuti a questo non essere un mini-dump completo. È giusto?

+0

Non è necessario disporre di simboli per ottenere una traccia dello stack gestito. Tuttavia, generalmente è necessaria una discarica completa. È una discarica completa del processo o solo una mini-discarica? –

+0

Sì, le voci mancanti sono probabilmente causate dal fatto che il dump non è pieno. –

risposta

3

In un commento sopra, lei dice che || comando restituisce "Utente mini dump". Per eseguire correttamente il debug del codice .NET, è necessario un dump completo, che indicherebbe "Memoria mini utente memoria completa" da || comando. Penso che questo sia il tuo problema. Senza l'accesso agli heap del caricatore completo, non è possibile eseguire il mapping di un indirizzo di codice su un metodo .NET, quindi non è possibile ottenere una traccia dello stack. Se è possibile riprodurre questo problema, acquisire un dump completo. È possibile utilizzare ADPlus, ProcDump o DebugDiag per acquisire un dump in caso di arresto anomalo.

4

Sembra che WinDbg non prelevi i simboli per la DLL. Puoi verificarlo impostando il percorso del simbolo e usando !sym noisy per risolvere i problemi, se necessario.

Non posso dire perché !ip2md non funziona in questo caso, ma ci sono altri modi per ottenere il codice per DoSomething2. Prova a !name2ee sul nome del metodo, ad es. !name2ee *!TypeName.DoSomething2 oppure è possibile ottenerlo tramite il tipo stesso come questo !name2ee *!Namespace.TypeName e quindi !dumpmt -md <method table> sulla tabella dei metodi ottenuta da !name2ee.

Una volta ottenuto il codice, il comando !u può mostrare un dump annotato .NET del codice assembly. Utilizzando l'offset dall'eccezione, è possibile determinare la natura di NullReferenceException.

+0

Grazie! Pensavo di aver caricato dei simboli. Senza simboli, ottengo output diversi (vedi le mie modifiche nella domanda). Proverò presto i metodi alternativi e riferirò. –

+0

La maggior parte dei comandi di debug .NET non funzionerà se il dump non è un dump completo. Mi chiedo se questo è il caso qui? –

+0

@SteveJohnson, c'è un modo per me di dire se questa è o non è una discarica completa? il comando! ip2md funziona per ottenere il descrittore del metodo della funzione in cui si è verificato l'arresto anomalo finale. –

4

Probabilmente stai usando un file PDB strippato, il predefinito generato per un progetto nella build Release. Tutte le informazioni sul numero di file e di linea vengono rimosse da tale file.

Passare alla configurazione Rilascio, Progetto + Proprietà, scheda Costruisci, Avanzato, Informazioni di debug = "completo".

Questo è intenzionale btw, le informazioni sul numero di riga non sono molto accurate per la build di rilascio. L'ottimizzatore di jitter sposta il codice in giro, quindi è necessario tenere presente che un numero di riga visualizzato è un'approssimazione.

Problemi correlati