2012-05-06 23 views
5

Sto usando WinDbg per eseguire il debug dei file di dump per un po 'di tempo.
C'è un bel "trucco" che funziona con i programmi nativi x86, è possibile eseguire la scansione dello stack per i flag CONTEXT_ALL (0x1003f).come posso trovare le eccezioni native in uno stack x64?

In x64 le CONTEXT_ALL bandiere a quanto pare non contengono 0x1003f ...

Ora il problema è che a volte quando si mescolano nativa con codice gestito, i metodi regolari di trovare eccezioni (come .exc o. LASTEVENT).

Qual è l'equivalente di questo 0x1003f in x64? c'è una tale costante?

EDIT:

A proposito, se vi stavate chiedendo, in teoria avrebbe dovuto essere 10003f a causa delle definizioni:

#define CONTEXT_I386 0x00010000 
#define CONTEXT_AMD64 0x00100000 

#define CONTEXT_CONTROL    0x00000001L // SS:SP, CS:IP, FLAGS, BP 
#define CONTEXT_INTEGER    0x00000002L // AX, BX, CX, DX, SI, DI 
#define CONTEXT_SEGMENTS   0x00000004L // DS, ES, FS, GS 
#define CONTEXT_FLOATING_POINT  0x00000008L // 387 state 
#define CONTEXT_DEBUG_REGISTERS  0x00000010L // DB 0-3,6,7 
#define CONTEXT_EXTENDED_REGISTERS 0x00000020L // cpu specific extensions 
#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS) 
#define CONTEXT_ALL (CONTEXT_FULL | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS | CONTEXT_EXTENDED_REGISTERS) 

#define CONTEXT_I386_FULL CONTEXT_I386 | CONTEXT_FULL 
#define CONTEXT_I386_ALL CONTEXT_I386 | CONTEXT_ALL 
#define CONTEXT_AMD64_FULL CONTEXT_AMD64 | CONTEXT_FULL 
#define CONTEXT_AMD64_ALL CONTEXT_AMD64 | CONTEXT_ALL 

ma non è ...

risposta

2

Di solito utilizzo i valori del registro dei segmenti per la mia chiave per trovare i record di contesto (ES e DS hanno lo stesso valore e sono uno accanto all'altro nella struttura CONTEXT). Anche il trucco delle bandiere è pulito.

Forzare un'eccezione in un'applicazione di prova allora a scavare la struttura record di contesto dallo stack, si presenta come il valore di magia nel mio caso sarebbe 0x10001f:

0:000> dt ntdll!_context 000df1d0 
... 
    +0x030 ContextFlags  : 0x10001f 
... 
    +0x03a SegDs   : 0x2b 
    +0x03c SegEs   : 0x2b 
... 

Si noti inoltre che il valore ContextFlags non è il inizio della struttura, quindi se trovi quel valore devi sottrarre @@ C++ (# FIELD_OFFSET (ntdll! _CONTEXT, ContextFlags)) da esso per ottenere la base della struttura di contesto.

Inoltre, nel caso in cui non fosse ovvio, questo valore proviene da una dimensione del campione di esattamente uno. Potrebbe non essere corretto nel tuo ambiente ed è ovviamente soggetto a modifiche (come qualsiasi implementazione specifica come questa).

+0

sembra funzionare, ma qual è lo spostamento indietro all'inizio della struttura? Non sono riuscito a ottenere il mio stack da questo ancora. –

+0

Il valore che stai cercando rappresenta presumibilmente il campo ContextFlags della struttura _CONTEXT. Quando trovi il valore magico sullo stack, l'indirizzo del puntatore dello stack punta all'indirizzo del campo ContextFlags della struttura. Pertanto, per ottenere la base della struttura è necessario sottrarre l'offset del campo ContextFlags. – snoone

Problemi correlati