2011-09-27 11 views
10

Tengo un problema por el cual, 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: How can I debug a win32 process that unexpectedly terminates silently?.¿Cómo puedo determinar por qué mi proceso termina?

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:

  • puntos de interrupción poniente en ExitThread y ExitProcess
  • Configuración de manejadores de excepciones no controladas y parametros no válidos (set_terminate y _set_invalid_parameter_handler)
  • Cambio _set_abort_behavior y _set_error_mode.
  • Indicando al depurador que detenga la ejecución en todas las excepciones lanzadas.

Pero en vano, ninguno de los controladores se llama y ninguno de los puntos de interrupción se activan. ser arrojado

  1. no relacionados (ver Boletín abajo) veo EEFileLoadException:

    Lo que he observado: Cuando se bloquea el proceso, veo dos cosas en la ventana de salida de depuración. 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. 
    
  2. Cuando termina, todas las discusiones volver 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 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 lo que causa esto, y opcionalmente; ¿cómo puedo ver esto en el depurador?

actualización En cuanto a la EEFileLoadException, de hecho, es lanzado antes de que el programa hace la llamada que hace que se termine, por lo que no está relacionado con la terminación del proceso.

actualización Acabo de leer que set_terminate no funciona en el depurador por lo que está fuera de la 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 alguna manera mejor de descubrir qué va mal?

+0

me di cuenta de que el controlador de terminar no se llama ya que están instalados en una base por hilo y no tengo acceso a la rosca estrellarse. –

+0

Estoy teniendo una situación similar a esta, excepto en mi caso, los mensajes TRACE tampoco se entregan a la Ventana de Salida. Cuando me conecté con WinDebug, descubrí que había una llamada 'DebugBreak()' que VS ignoraba, lo que provocó que el proceso 'terminara()', lo que dio como resultado 'El programa [0x2F74] 'OUTLOOK.EXE' salió con el código -1073740777 (0xc0000417) .' Lamentablemente, no puedo entender por qué Visual Studio está ignorando el programa que se supone que está depurando. –

Respuesta

0

Ejecuta el depurador nuder de la aplicación (o adjúntalo a un proceso en ejecución), presiona Ctrl+Alt+E y marca las casillas para que la ejecución del stop del depurador sea una excepción para ti.

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.

razones típicas para una aplicación se cierre inesperadamente son:

  • algo realmente mensajes WM_QUIT mensaje y esto da instrucciones a la aplicación para cerrar
  • una excepción tiene lugar, y no se maneja (especialmente en el fondo. hilo); la excepción atraviesa la pila de llamadas hasta OS y que no sabe qué hacer con todas las cosas y sólo mata el proceso

Como EEFileLoadException excepción tiene lugar y no knnow de qué se trata, que tal vez lo haría quiero que lo primero entienda si se maneja o no, si en realidad es algo fatal para su aplicación.

+1

Ya intenté instruir al depurador para detenerse en todas las excepciones arrojadas sin suerte. –

+0

Además, no creo que 'WM_QUIT' sea el problema ya que la aplicación termina al depurar el hilo principal. Esto señalaría que otro hilo es el culpable. –

+0

¿El depurador se detiene en la excepción? ¿Qué tipo de depurador estás usando, nativo y/o administrado? –

-2

Me enfrenté con el 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.

2

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 continuación, ejecute procdump desde una línea de comando como este: procdump -ma -t -w foo.exe

-ma indica lleno de volcado de memoria

-t indica volcado de escritura en la terminación del proceso

- w indica que se debe esperar a que se inicie el proceso si aún no se está ejecutando

Luego ejecute la aplicación fuera de 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 a ProcDump: http://technet.microsoft.com/en-us/sysinternals/dd996900

Cuestiones relacionadas