visual studio 2010 - vista - ¿Cómo puedo determinar por qué mi proceso termina?
visual studio code español (3)
Tengo un problema en el que, durante una llamada a una rutina de biblioteca de un tercero, mi proceso finaliza. Estoy completamente incapaz de detectar esto en mi depurador. Esto puede estar relacionado con esta pregunta: ¿cómo puedo depurar un proceso win32 que inesperadamente termina en silencio? .
Cuando paso una llamada a esta biblioteca, el proceso que se depura simplemente finaliza. Si esta finalización se debió a una excepción no controlada o una violación de acceso a la memoria, el depurador la habría atrapado. Así que mi mejor suposición es que el proceso de alguna manera termina normalmente.
Lo que he intentado:
- Establecer puntos de interrupción en
ExitThread
yExitProcess
- Configuración de manejadores para excepciones no controladas y parámetros inválidos (
set_terminate
y_set_invalid_parameter_handler
) - Cambiando
_set_abort_behavior
y_set_error_mode
. - Instruir al depurador para detener la ejecución en todas las excepciones lanzadas.
Pero fue en vano, ninguno de los manipuladores fue llamado y ninguno de los puntos de interrupción se activaron.
Lo que he observado: cuando el proceso falla, veo dos cosas en la ventana de salida de depuración:
No relacionado (ver la actualización más abajo)
Veo queEEFileLoadException
está siendo lanzado.Un google rápido de esta excepción no me da una respuesta clara a lo que significa esta excepción.First-chance exception at 0x7656b9bc (KernelBase.dll) in Program.exe: Microsoft C++ exception: EEFileLoadException at memory location 0x0030b5ac.. First-chance exception at 0x7656b9bc (KernelBase.dll) in Program.exe: Microsoft C++ exception: [rethrow] at memory location 0x00000000.. First-chance exception at 0x7656b9bc (KernelBase.dll) in Program.exe: Microsoft C++ exception: [rethrow] at memory location 0x00000000.. First-chance exception at 0x7656b9bc (KernelBase.dll) in Program.exe: 0xE0434352: 0xe0434352.
Al finalizar, todos los subprocesos devuelven el mismo código de error (STATUS_INVALID_CRUNTIME_PARAMETER). Este código de error significa, por lo que puedo decir, que una de las funciones de tiempo de ejecución de c ha recibido un parámetro no válido y la aplicación finaliza por razones de seguridad.
The thread ''Win32 Thread'' (0x12c0) has exited with code -1073740777 (0xc0000417). The thread ''Win32 Thread'' (0xe04) has exited with code -1073740777 (0xc0000417). The thread ''Win32 Thread'' (0x53c) has exited with code -1073740777 (0xc0000417). The thread ''Win32 Thread'' (0x116c) has exited with code -1073740777 (0xc0000417). The thread ''Win32 Thread'' (0x16e0) has exited with code -1073740777 (0xc0000417). The thread ''Win32 Thread'' (0x1420) has exited with code -1073740777 (0xc0000417). The thread ''Win32 Thread'' (0x13c4) has exited with code -1073740777 (0xc0000417). The thread ''Win32 Thread'' (0x40c) has exited with code -1073740777 (0xc0000417). The thread ''Win32 Thread'' (0xc78) has exited with code -1073740777 (0xc0000417). The thread ''Win32 Thread'' (0xd88) has exited with code -1073740777 (0xc0000417). The thread ''Win32 Thread'' (0x16c8) has exited with code -1073740777 (0xc0000417). The thread ''Win32 Thread'' (0xcb8) has exited with code -1073740777 (0xc0000417). The thread ''Win32 Thread'' (0x584) has exited with code -1073740777 (0xc0000417). The thread ''Win32 Thread'' (0x1164) has exited with code -1073740777 (0xc0000417). The thread ''Win32 Thread'' (0x1550) has exited with code -1073740777 (0xc0000417). The thread ''Win32 Thread'' (0x474) has exited with code -1073740777 (0xc0000417). The program ''[5140] Program.exe: Native'' has exited with code -1073740777 (0xc0000417).
Lo que realmente quiero saber es qué causa esto, y opcionalmente; ¿cómo puedo ver esto en el depurador?
Actualización En cuanto a la EEFileLoadException
, de hecho se lanza antes de que el programa realice la llamada que hace que finalice, por lo que no está relacionada con la finalización del proceso.
Actualización Acabo de leer que set_terminate
no funciona en el depurador, por lo que está fuera de cuestión. Y como mencioné en mi comentario, los manejadores se administran por subprocesos, por lo que no tengo acceso al controlador relevante.
Además, el programa probablemente se cuelga en un subproceso de trabajo al que no tengo acceso, por lo que es difícil establecer cualquier punto de interrupción / controlador en absoluto.
¿Hay una mejor manera de descubrir qué va mal?
Configure procdump para generar un volcado de su proceso en el momento de la finalización del proceso. No estoy seguro de si VS2010 puede abrir archivos de volcado, pero windbg puede. A continuación, vacíe todas las pilas de hilos y verá la que causa la terminación. Luego podrá inspeccionar la pila para encontrar el argumento ofensivo.
Si su aplicación es foo.exe, ejecute procdump desde un símbolo del sistema como este: procdump -ma -t -w foo.exe
-ma indica volcado de memoria completo
-t indica volcado de escritura al finalizar el proceso
-w indica esperar a que se inicie el proceso si aún no se está ejecutando
Luego ejecuta tu aplicación fuera de cualquier depurador. Una vez que termina, debería ver la salida de procdump que indica que el proceso ha finalizado y que está escribiendo un archivo de volcado.
Aquí está el enlace para procdump: http://technet.microsoft.com/en-us/sysinternals/dd996900
Ejecute su depurador de nuder de aplicación (o adjúntelo a un proceso en ejecución), presione Ctrl+Alt+E
y marque las casillas para que la ejecución de detención del depurador sea una excepción para usted.
Cada vez que se produce una excepción, el depurador se romperá. Podrá verificar los estados de los hilos / la pila de llamadas para posiblemente identificar el problema.
Las razones típicas para que una aplicación finalice de forma inesperada son:
- algo realmente
WM_QUIT
mensajeWM_QUIT
y esto indica que la aplicación se cierre - se produce una excepción, y no se gestiona (especialmente en el hilo de fondo); la excepción atraviesa la pila de llamadas hasta el sistema operativo y no sabe qué hacer con todas las cosas y solo mata el proceso
A EEFileLoadException
tenga lugar la excepción EEFileLoadException
y no sepa de qué se trata, tal vez le interese lo primero que se entienda si se maneja o no, si en realidad es algo fatal para su aplicación.
Me enfrenté al mismo problema antes. Acabo de eliminar el archivo obj en el proyecto C #. Y reconstruir nuevamente y el proyecto funcionó. Espero que esto resuelva su problema.