2010-11-04 13 views
5

Estoy tratando de utilizar MiniDumpWriteDump() de la API para volcar un proceso B estrellado de otro proceso A. Estoy haciendo esto porque MSDN lo dijo:¿Hay alguna forma de conocer el ID del hilo en otro proceso que arroja una excepción?

MiniDumpWriteDump debería llamarse de un proceso separado en todo caso posible, en lugar de dentro del proceso de destino que se está volcando.

El MiniDumpWriteDump() se define como este:

BOOL WINAPI MiniDumpWriteDump(
    __in HANDLE hProcess, 
    __in DWORD ProcessId, 
    __in HANDLE hFile, 
    __in MINIDUMP_TYPE DumpType, 
    __in PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, 
    __in PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, 
    __in PMINIDUMP_CALLBACK_INFORMATION CallbackParam 
); 

Especialmente, la ExceptionParam es de tipo PMINIDUMP_EXCEPTION_INFORMATION, que se define como a continuación:

typedef struct _MINIDUMP_EXCEPTION_INFORMATION { 
    DWORD    ThreadId; 
    PEXCEPTION_POINTERS ExceptionPointers; 
    BOOL    ClientPointers; 
} MINIDUMP_EXCEPTION_INFORMATION, *PMINIDUMP_EXCEPTION_INFORMATION; 

Ahora estoy preguntando cómo preparar los siguientes 2 parámetros:

ThreadId El identificador del hilo que lanza la excepción.

ExceptionPointers Un puntero a una estructura EXCEPTION_POINTERS especificando una descripción por ordenador independiente de la excepción y el contexto procesador en el momento de la excepción.

¿Cómo podría obtener el identificador de subproceso y los punteros de excepción en el proceso B mientras se ejecuta en el proceso A?

Gracias.

+0

Me enfrento a un problema similar. No puedo pasar PEXCEPTION_POINTERS ExceptionPointers a otro proceso. (Si uso el concepto FileMapping, termino obteniendo un puntero nulo). Sírvase explicar cómo se decidió en este caso. –

Respuesta

0

Para tener un volcado automático creado en una excepción dada en un nombre de proceso específico, mi consejo sería usar DebugDiag o AdPlus. Esos son programas externos (¡y gratuitos!) Que puede configurar para hacerlo.

Si realmente desea escribir el volcado usted mismo, puede hacerlo en el proceso B: MSDN le advierte que no es una buena idea, porque errores desagradables como falta de memoria, desbordamiento de pila o acumulación de corrupción (la lista es no exhaustivo) seguramente usará memoria y pila, por lo que puede terminar sin ningún tipo de volcado (y un bloqueo del proceso muy malo). Desde mi experiencia, esto es bastante raro (solía trabajar en un software distribuido C++ muy estresado). Para otras excepciones, debería estar bien. En ese caso, puede usar un traductor de excepciones (vea _set_se_translator) o un manejador de excepciones vectorizadas (vea AddVectoredContinueHandler) o la función GetExceptionInformation() para obtener la estructura EXCEPTION_RECORD (puede haber otras formas que no conozco).

Crear el volcado del proceso A después de una excepción en el proceso B significa que debe copiar toda la información sobre la excepción y advertir al proceso A de que debe volcar algo con esta excepción. Esto consumirá memoria y acumulación, por lo que tendrá la misma limitación que la explicada anteriormente.

la esperanza de que le ayudará

2

Un puntero a una estructura que describe la excepción MINIDUMP_EXCEPTION_INFORMATION cliente que causó la minidump que se genere. Si el valor de este parámetro es NULL, no se incluye información de excepción en el archivo de minivolcado.

A pesar del hecho de que el parametro está marcado __in y no __in_opt que de hecho puede pasar NULL aquí. Para obtener esa información en primer lugar del proceso de destino, su proceso debería estar depurándolo de todos modos.

¿Cómo y cuándo se sabe que el proceso A toma un minivolcado del proceso B? Si A efectivamente está depurando B, cuando WaitForDebugEvent regresa con un EXCEPTION_DEBUG_EVENT, la información está disponible en la estructura de información.

Si A no está depurando B, entonces quizás B le está diciendo a A a través de algún mecanismo de IPC "Hola, me estoy cayendo, toma un minivolcado". En este caso, cualquiera de B podría tomar el volcado o pasar la información de excepción a través del mismo mechansim de IPC a A. De nuevo, esto es problemático por las mismas razones por las que llamar a MiniDumpWriteDump en el proceso de bloqueo es problemático, si las cosas están explotando, la cosa que podría haber explotado puede ser lo que necesita decirle a A al respecto.

El otro mecanismo que podría tener A realizar un volcado para B es A se instala como el depurador JIT, en cuyo caso, A depurará B y podrá usar las API de depuración para obtener la información de excepción.

Si A solo toma minivolcados de B periódicamente, no habrá necesariamente excepciones, por lo que puede pasar NULL en este caso.

Tenga en cuenta que si está con la intención de hacer algo como

WaitForSingleObject(handleToProcessB, INFINITE); 
MiniDumpWriteDump(handleToProcessB, ...) 

que esto no va a funcionar. El sistema operativo mantiene unas pocas cosas, principalmente el código de salida para el proceso, no el espacio de direcciones virtuales y las pilas que necesita para tomar un minivolcado.

Cuestiones relacionadas