2009-01-16 14 views
7

Este es un error bastante complicado, y he intentado buscar otras fuentes de ayuda, pero por razones que no entiendo, "Program Crashes in Vista" no es la consulta más útil.Depuración de un bloqueo después de salir? (Después del principal devuelto)

El problema que estoy teniendo es que el programa en el que estoy trabajando -un software de visualización de datos gráficos multiproceso que usa OpenGL y la API de Windows- se cuelga después de que WinMain() retorna. Intenté recorrer la rutina de apagado y observar un seguimiento de pila, y el último bit de código que no es de ensamblaje es _crtExitProcess, donde falla en la llamada real ExitProcess (0). Después de eso, el seguimiento de pila muestra kernel32.dll y cuatro ntdll.dll, que es donde realmente se bloquea.

Este error solo ocurre en Vista, y el mismo código exacto cuando se ejecuta en XP sale normalmente. Realmente no puedo pensar en nada que me ayude a solucionar este problema, y ​​la depuración de este problema es algo que nunca he aprendido realmente. Cualquier ayuda sería apreciada.

+0

¿Cuál es exactamente la excepción que está recibiendo? –

+0

0xC0000005 - Infracción de acceso. –

+0

¿Se las arregló para ejecutarlo en un depurador de memoria como purificar? Me parece un problema de memoria ... –

Respuesta

5

que he hecho un poco de excavar alrededor, y he encontrado un par de postes alrededor que sugieren que no eres el único que sufre de esto:

en particular, el segundo es de interés, donde Tom Chm menciona:

W Creemos que hemos identificado la causa raíz de de nuestro bloqueo, y al agregar un destructor virtual a nuestra interfaz, el contenedor de clase parece resolver nuestro problema . Pero nos gustaría saber la causa exacta del accidente para verificar que no barrimos el problema real debajo de la alfombra.

El problema puede ser con un destructor en algún lugar, o falta del mismo. Si tiene una forma de conectar un depurador y pasar por el proceso de apagado, podría ser de ayuda.

Es posible que desee leer todo el hilo y ver si hay algo que puede aprender. Es decir, si aún no ha encontrado estas publicaciones en su búsqueda, por supuesto.

+0

http://support.microsoft.com/kb/941833 Eso parece muy relevante, ¡gracias! No podemos ejecutar la actualización en esta computadora porque es para un cliente, pero esto puede ser algo que podamos decirle que haga. El error es idéntico a lo que estamos teniendo. –

+0

Espero que puedas ordenarlo todo relativamente sin dolor: este tipo de error es el más difícil de descubrir. –

+0

¿cómo se puede bloquear el programa solo porque falta un destructor? ¿No se perdería la memoria? –

3

Suena un poco como un problema con un destructor.

Compruebe si hay objetos que se destruyen durante el apagado. Esto será principalmente objetos globales o estáticos. Mire cuidadosamente sus destructores para un caso de acceso a algo que ya no es válido. En un entorno de subprocesos múltiples, puede ser una condición de carrera, donde un objeto se destruye mientras otro subproceso todavía lo está utilizando.

Intenta escribir un registro a medida que se destruyen los objetos. p.ej.

SomeClass::~SomeClass() 
{ 
    WriteLog("Begin ~SomeClass()"); 
    // do whatever 
    WriteLog("End ~SomeClass()"); 
} 

WriteLog() debe abrir el archivo de registro, escribir y cierre el archivo para asegurarse de que el archivo se vacía. Usar una Mutex o sección crítica para evitar conflictos sería una buena idea.

Mirar el registro después de un choque puede darte algunas pistas sobre lo que está sucediendo.

+0

Si este es uno de nuestros destructores, ¿no aparecería en el seguimiento de la pila? Además, ¿cuál sería la diferencia entre Vista y XP para esto? –

+0

Los destructores son bastante específicos de C++. Se llamarán desde el tiempo de ejecución de C++. – MSalters

Cuestiones relacionadas