2012-05-06 9 views
5

He estado usando WinDbg para depurar archivos de volcado desde hace un tiempo.
Hay un buen "truco" que funciona con programas nativos x86, puede escanear la pila para las banderas CONTEXT_ALL (0x1003f).¿cómo puedo encontrar excepciones nativas en una pila x64?

En los 64 CONTEXT_ALL banderas aparentemente no contienen 0x1003f ...

Ahora el problema es que a veces cuando se mezcla nativa con código administrado, los métodos regulares de encontrar excepciones (como .exc o. último evento).

¿Cuál es el equivalente de este 0x1003f en x64? ¿hay tal constante?

EDIT:

Por cierto, si usted se preguntaba, en teoría debería haber sido 10003f debido a las definiciones:

#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 

pero no es ...

Respuesta

2

Usualmente uso los valores de registro de segmento para mi clave para encontrar registros de contexto (ES y DS tienen el mismo valor y están uno al lado del otro en la estructura CONTEXT). El truco de banderas es muy bueno también.

Forzar una excepción en una aplicación de prueba a continuación, la excavación de la estructura de registro contexto de la pila, parece que el valor mágico en mi caso sería 0x10001f:

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

También tenga en cuenta que el valor ContextFlags no está en el inicio de la estructura, por lo que si encuentra ese valor, deberá restar @@ C++ (# FIELD_OFFSET (ntdll! _CONTEXT, ContextFlags)) para obtener la base de la estructura de contexto.

Además, por si no fuera obvio, este valor proviene de un tamaño de muestra de exactamente uno. Puede no ser correcto en su entorno y, por supuesto, está sujeto a cambios (como lo es cualquier implementación específica como esta).

+0

que parece funcionar, pero ¿cuál es el desplazamiento al principio de la estructura? No pude obtener mi stack de esto todavía. –

+0

El valor que está buscando presumiblemente representa el campo ContextFlags de la estructura _CONTEXT. Cuando encuentre el valor mágico en la pila, la dirección del puntero de la pila apunta a la dirección del campo ContextFlags de la estructura. Por lo tanto, para obtener la base de la estructura, necesita restar el desplazamiento del campo ContextFlags. – snoone

Cuestiones relacionadas