2012-02-01 14 views
10

Ho un file di crash-dump (la mia applicazione Windows a 32 bit si è arrestata in modo anomalo su un computer del cliente). Il codice di eccezione è 0xE06D7363. Quindi, ho trovato questo article dai blog MSDN sulla decodifica dei parametri di eccezione. Ma una ricetta dell'articolo non funziona per me:Decodifica dei parametri di un'eccezione C++ generata (0xE06D7363)

0:000> .exr -1 
ExceptionAddress: 753ad36f (KERNELBASE!RaiseException+0x00000058) 
    ExceptionCode: e06d7363 (C++ EH exception) 
    ExceptionFlags: 00000001 
NumberParameters: 3 
    Parameter[0]: 19930520 
    Parameter[1]: 0052ccd8 
    Parameter[2]: 564099d8 
0:000> dd 564099d8 l4 
564099d8 00000000 00000000 00000000 564099d0 
0:000> dd 564099d0 l2 
564099d0 00000001 564099b4 
0:000> dd 564099b4 l2 
564099b4 00000001 56454aec 
0:000> da 56454aec+8 
56454af4 "????????????????????????????????" 
56454b14 "????????????????????????????????" 
56454b34 "????????????????????????????????" 
56454b54 "????????????????????????????????" 
56454b74 "????????????????????????????????" 
56454b94 "????????????????????????????????" 
56454bb4 "????????????????????????????????" 
56454bd4 "????????????????????????????????" 
56454bf4 "????????????????????????????????" 
56454c14 "????????????????????????????????" 
56454c34 "????????????????????????????????" 
56454c54 "????????????????????????????????" 

Come posso far funzionare questo metodo? O forse ci sono altri modi per analizzare crash-dump con questa eccezione?

Di seguito alcune informazioni da !analyze -v:

PROCESS_NAME: ArcMap.exe 
MODULE_NAME: arcmap 
FAULTING_MODULE: 76fa0000 ntdll 
DEBUG_FLR_IMAGE_TIMESTAMP: 4e793643 
ERROR_CODE: (NTSTATUS) 0xe06d7363 - <Unable to get error code text> 
EXCEPTION_CODE: (NTSTATUS) 0xe06d7363 - <Unable to get error code text> 
EXCEPTION_PARAMETER1: 19930520 
EXCEPTION_PARAMETER2: 0052ccd8 
EXCEPTION_PARAMETER3: 564099d8 

risposta

11

Ci sono molti dettagli tecnici coinvolti. Posso darti la direzione

Il secondo parametro di eccezione (0052ccd8) è un puntatore a una struttura _s__ThrowInfo, che descrive il tipo generato. Il terzo parametro (564099d8) è un puntatore all'oggetto generato.

Prima di tutto analizziamo il tipo di oggetto generato. Il _s__ThrowInfo punta a una struttura costante (generata al momento della compilazione), che risiede nel file eseguibile (EXE o DLL), che viene mappato nello spazio di indirizzamento del processo.

Se la memoria globale è inclusa nel crash-dump, è possibile trovarla lì. Altrimenti puoi dedurlo dall'eseguibile. Sottrai l'indirizzo "base" dal tuo eseguibile (supponendo che sia stato caricato al suo indirizzo preferito) e otterrai l'offset di questa struttura all'interno del tuo eseguibile.

Decodificare il tipo effettivo da questa struttura è delicato. Include le informazioni sui tipi a cui può essere assegnato (polimorfismo C++), oltre al d'tor (distruttore) nel caso in cui sia un tipo non banale (con informazioni non banali) ed è stato generato in base al valore. La tabella dei tipi in cui è possibile eseguire il cast per contenere i puntatori alle strutture appropriate che descrivono questi tipi. Tra le altre cose ci sono "codifiche" testuali di questi tipi.

informazioni sul layout di queste strutture può essere trovata here:

Avanti, l'oggetto lanciato. Il suo indirizzo di solito appartiene alla memoria dello stack (in senso stretto non è obbligatorio, si può lanciare un oggetto globale o assegnato in modo dinamico (su heap), ma di solito non è così). Se hai lo stack incluso nel tuo crash dump, vedrai il layout dell'oggetto. Accoppiato con il tipo che (si spera) capirai cosa significa.

Se non si dispone della memoria dello stack inclusa nel crash dump, non sarà possibile recuperare l'oggetto.

Inoltre il tuo oggetto può contenere membri che puntano ad altre cose (come stringhe o altri oggetti) che potrebbero non essere necessariamente allocati nello stack. Molto probabilmente non riuscirai a realizzare quei membri, a meno che tu non abbia il dump della memoria completa.

1

vecchia domanda e una risposta molto tardi (domanda spuntato nella lista attiva in modo da rispondere)

l'essenza di Raymond Chen e valdos rispondere in uno script consice

0:000> dt _s_throwinfo pCatchableTypeArray[0]->arrayOfCatchableTypes->pType->name @@c++(((ntdll!_EXCEPTION_RECORD *) @@masm(@esp+4))->ExceptionInformation[2]) 
cppexept!_s_ThrowInfo 
    +0x00c pCatchableTypeArray          : [0] 
     +0x004 arrayOfCatchableTypes          : [0] 
     +0x004 pType              : 
      +0x008 name              : [0] ".PAD" 
Problemi correlati