2010-02-03 12 views
5

Mi proceso a veces arroja una excepción como dllnotfound después del inicio. tengo un servicio de monitoreo responsable de mantener el estado constante del proceso.cómo rastrear si un proceso determinado arroja una excepción, usando el servicio de Windows en C#

¿cómo puedo hacer un seguimiento del estado de mi proceso utilizando el servicio de Windows.

hay una implementación de código abierto del servicio de Windows que mantiene/realiza un seguimiento del estado del proceso en Windows.

Respuesta

2

Editar: Así que el problema real no era que el proceso estuviera muriendo, sino que el proceso estaba atascado en un diálogo de controlador de excepción esperando que el usuario presionara para depurar o cancelar. La solución al problema fue desconectar la ventana de depuración JIT .net, instrucciones aquí http://weblogs.asp.net/fmarguerie/archive/2004/08/27/how-to-turn-off-disable-the-net-jit-debugging-dialog.aspx

Mi solución propuesta original es a continuación


No es un servicio de la ventana, pero este es un programa muy fácil .NET escribir.

use System.Diagnostics.Process para obtener un objeto Proceso para el proceso que desea verificar. Puede usar GetProcessByName si desea abrir un proceso existente. Si crea el proceso desde C#, entonces ya tendrá el objeto de proceso.

Entonces solo puede WaitForExit con o sin un tiempo de espera en el objeto Process. o pruebe la propiedad HasExited, o registre una devolución de llamada Exited. Una vez que el proceso haya finalizado, puede verificar la propiedad ExitCode para averiguar si el proceso arrojó un valor de error.

+0

sí, comencé el proceso desde C#. cuando el proceso arroja una excepción, su estado se está ejecutando, verifico la propiedad hasexited() cada 10 segundos, pero no se sale del estado. el proceso arroja la excepción no encontrada y me pregunta si quiero iniciar un depurador. – Kazoom

+0

¿Tiene el código para el proceso de destino? Tendrá que ejecutar el código _en el proceso objetivo_ si desea hacer algo con la excepción _antes de_ hace que el proceso salga. –

+0

cambiar el código de proceso de destino sería mi último recurso, ¿hay alguna configuración que evite que Windows muestre un cuadro de mensaje emergente cuando un proceso arroja una excepción como dllnotfound. si puedo resolver de alguna manera para descartar el popupbox automáticamente una vez que llega un error, el proceso se muere, de lo contrario, sigue ejecutándose – Kazoom

2

Eso no es posible, las excepciones son locales a un subproceso primero, local a un proceso secundario si no se controla. Una excepción no controlada dará por terminado el proceso. La única metralla que puedes recoger de un proceso tan muerto es el código de salida del proceso. Que debería establecerse en 0xe0434f4e, el código de excepción para una excepción no gestionada. No hay otra información relevante disponible, a menos que haya un manejador de excepciones no manejado en el proceso que registre el estado. Ese estado es muy poco confiable, el proceso sufrió un gran ataque al corazón.

Mantener procesos múltiples sincronizados y funcionando correctamente cuando pueden morir por excepciones es extraordinariamente difícil. Solo la muerte puede detectarse de manera confiable, evitar hacer más.

+0

sí, pero si no se encuentra dll, el proceso muestra un cuadro de mensaje y espera a que el usuario lo descarte. Mientras tanto, el estado del proceso se está ejecutando, es posible hacer que el proceso no muestre el cuadro de mensaje como lo hace y muera. – Kazoom

+0

¿Realmente importa? No va a funcionar nunca a menos que alguien ponga la DLL en el lugar correcto. Alguien lo hará después de que haga clic en Aceptar 10 veces más o menos. Anyhoo, tal vez SetErrorMode() para suprimir el cuadro de mensaje. –

+0

dllnotfoundexception es solo un ejemplo, no quiero que el proceso se atasque y el monitor piensa que todavía está en ejecución; si el proceso encuentra una excepción, debería morir, por lo que el monitor puede reiniciar una nueva instancia de ese proceso. todo el proceso/monitor se ejecuta sin la intervención del usuario. no habría nadie para hacer clic en Aceptar :( – Kazoom

-1

Una cosa que podría hacer es supervisar el uso de la CPU del proceso. Supongo que su proceso desaparece cuando se lanza la excepción. Por lo tanto, el uso de la CPU del proceso debe ser 0 ya que ya no está disponible. Por lo tanto, si el uso de la CPU permanece en cero durante un cierto período de tiempo, puede suponer con seguridad que el proceso ha elevado la excepción. Este método no es infalible, ya que basar su decisión en el uso de la CPU y un proceso legítimo puede tener un uso de CPU cero durante un período de tiempo determinado. Puede incorporar esta verificación dentro de su servicio de monitoreo o puede escribir un script VB simple para verificar externamente el proceso del uso de la CPU.

+0

¿Le importaría explicar el motivo del voto a la baja? – naivnomore

0

En el caso de DllNotFoundException y otras cosas que suceden en el arranque, puede hacer que la solicitud se indique cuando se termine la puesta en marcha. Haga que escriba una marca de tiempo en un archivo, por ejemplo. Su monitor puede comparar el momento en que la aplicación comenzó con el tiempo en el archivo.

1

Solicite a su proceso que escriba eventos y excepciones en el registro de la aplicación del sistema y haga que su monitor compruebe periódicamente las entradas para encontrar eventos relacionados con su proceso, y puede verificar los eventos del sistema para iniciar y detener eventos.

Si el proceso en sí es un servicio de Windows, puede verificar su estado usando `System.ServiceProcess.ServiceController '.

Cuestiones relacionadas