2012-06-26 193 views
9

Tengo un servicio de Windows que hace un trabajo intensivo cada minuto (en realidad está comenzando un nuevo hilo cada vez que se sincroniza con diferentes sistemas en http). El problema es que después de unos días se detiene repentinamente sin ningún mensaje de error.Servicio de Windows/No se puede crear una nueva página de protección para la pila

Tengo NLog en su lugar y me he registrado para 'AppDomain.CurrentDomain.UnhandledException'. La última entrada en el archivo de texto-log es solo una entrada normal sin ningún problema. Al buscar en EventLog, tampoco puedo encontrar ningún mensaje en el registro de la aplicación, sin embargo, hay dos entradas en el registro del sistema.

Uno básicamente dice que el servicio ha finalizado inesperadamente. Nada mas. El segundo evento (al mismo tiempo que el primero) dice: "... No se puede crear una nueva página de protección para la pila ..."

Por lo que he leído, este es probablemente un desbordamiento de la pila excepción. No estoy analizando ningún XML y no hago trabajo recursivo. Tengo un servidor web usando Gate, Nancy y SignalR y hago que RavenDB se ejecute en modo incrustado. Cada minuto se inicia una nueva tarea utilizando Taskfactory desde .NET 4.0 y también tengo un ContinueWith donde reinicio un System.Timers.Timer para volver a disparar en un minuto.

¿Cómo puedo comenzar a investigar este problema? ¿Cuáles podrían ser las posibles razones de tal error?

+3

Sí, es un SO. No es código administrado, informa la excepción de manera diferente. Tienes un montón de código que no has escrito, todo es sospechoso. –

Respuesta

9

Con base en la información que proporcionó, yo por lo menos, como mínimo, lo siguiente:

  1. prestar especial atención a las llamadas de terceros, y añadir información adicional a la explotación en esos puntos.
  2. Existen algunas circunstancias en las que AppDomain.CurrentDomain.UnhandledException no lo ayudarán, ya que uno de ellos es StackOverflowException. Creo que CLR simplemente le dará una cadena en este caso en lugar de un seguimiento de la pila.
  3. Preste especial atención a las áreas donde se introduce más de un hilo.

Un ejemplo de un menudo pasado por alto StackOverflowException es:

private string myString; 
public string MyString { get { return MyString; } } //should be myString 
+1

Gracias por su respuesta! Trataré de descartar la tarea. Nuevo.Continuar con eso y ver si eso hace alguna diferencia. Una pregunta: ¿podría ser también System.OutOfMemoryException? –

+1

@DanielLang: Sí, eso también es posible. –

+0

@BryanCrosby ¿es posible obtener una excepción System.OutOfMemoryException y no registrarla específicamente en la sección de aplicación del visor de eventos? –

2

Así como un 'para lo que vale' - en mi caso fue reportado este error cuando el código estaba intentando escribir en el de Windows Event Log y el usuario interactivo no tenían suficiente permiso. Esta era una aplicación de consola pequeña que registraba excepciones en un archivo de texto y el registro de eventos (si lo deseaba). A excepción, el archivo de texto se estaba actualizando pero luego este error fue arrojado y no fue capturado por el manejo del error. Al deshabilitar el registro de eventos se detuvo el error.

0

Por si acaso cualquier otra persona tiene el mismo problema, en mi caso descubrí que mi servicio de Windows estaba atrapado en un ciclo recursivo interminable accidentalmente. Entonces, si alguien más tiene este problema, tome en consideración las llamadas a métodos que pueden estar causando enormes bucles recursivos.

Cuestiones relacionadas