2012-02-01 9 views
10

Tengo un archivo de volcado de bloqueo (mi aplicación de Windows de 32 bits se ha bloqueado en la computadora de un cliente). El código de excepción es 0xE06D7363. Entonces, encontré este article de los blogs de MSDN sobre la decodificación de los parámetros de excepción. Pero una receta del artículo no funciona para mí:Decodificación de los parámetros de una excepción lanzada de C++ (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 "????????????????????????????????" 

¿Cómo puedo hacer que este método funcione? ¿O tal vez hay otras formas de analizar el bloqueo de volcados con esta excepción?

A continuación se muestra algo de información de !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 

Respuesta

11

No tenemos muchos detalles técnicos involucrados. Puedo darte la dirección.

El segundo parámetro de excepción (0052ccd8) es un puntero a una estructura _s__ThrowInfo, que describe el tipo arrojado. El tercer parámetro (564099d8) es un puntero al objeto arrojado.

Primero analicemos el tipo de objeto arrojado. El _s__ThrowInfo apunta a una estructura constante (generada en tiempo de compilación), que reside dentro de su archivo ejecutable (EXE o DLL), que está mapeado en el espacio de direcciones del proceso.

Si la memoria global está incluida en su volcado de emergencia, entonces puede encontrarla allí. De lo contrario, puedes deducirlo del ejecutable. Reste la dirección "base" de su ejecutable (suponiendo que se cargó en su dirección preferida), y obtendrá el desplazamiento de esta estructura dentro de su ejecutable.

Decodificar el tipo real de esta estructura es algo delicado. Incluye la información sobre los tipos en los que se puede convertir (polimorfismo C++), más el d'tor (destructor) en caso de que sea un tipo no trivial (con un tor no trivial) y se arrojó por valor. La tabla de tipos se puede convertir para contener punteros a las estructuras apropiadas que describen esos tipos. Entre otras cosas, hay "codificaciones" textuales de esos tipos.

información sobre el diseño de estas estructuras se pueden encontrar here:

A continuación, el objeto lanzado. Su dirección generalmente pertenece a la memoria de la pila (estrictamente hablando, esto no es obligatorio, se puede lanzar un objeto global o asignado dinámicamente (en el montón). Pero esto no suele ser el caso). Si tiene la pila incluida en su volcado de emergencia, verá el diseño del objeto. Junto con el tipo que (con suerte) se dará cuenta de lo que significa.

Si no tiene la memoria de pila incluida en su volcado de emergencia, no podrá recuperar el objeto.

Además su objeto puede contener miembros que apuntan a otras cosas (como cadenas u otros objetos) que no necesariamente se asignan en la pila. Lo más probable es que no se dé cuenta de esos miembros, a menos que tenga el volcado de memoria completa.

1

vieja pregunta y una respuesta muy tardía (pregunta apareció en la lista activa para responder)

la esencia de Raymond Chen y Valdos respuesta en un guión 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" 
Cuestiones relacionadas