2009-11-05 13 views
5

Mi servicio C# obtuvo un error interno de ejecución de .NET que apunta a un problema de recursión (por ejemplo, desbordamiento de la pila). El problema es que el servicio es bastante grande, así que estoy teniendo problemas para encontrar dónde ocurre realmente la recursión.¿Cómo encontrar recursividad en su aplicación?

¿Alguien con masivo regex mojo me puede conectar con una cadena de búsqueda que encontraría lo que necesito?

+0

¿No hay rastro de la pila? –

+0

No, la única razón por la que incluso sé que la aplicación se bloqueó es porque hay una entrada en el Registro de eventos que anuncia que se ha producido un error interno de .net framework y proporciona el código, que he rastreado para apilar problemas de desbordamiento. – AngryHacker

+1

¿Alguna vez ha encontrado este problema? ¿Si es así, cómo?Creo que la mayoría de la gente aquí no entendió que el programa se bloquea sin registro, excepto un error general de desbordamiento de pila en el registro de eventos del Servicio. –

Respuesta

5

Un recursividad no es fácil de encontrar en algunas situaciones como:

method1() { 
    method2() 
} 

method2() { 
    method1() 
} 

lo tanto una expresión regular, probablemente no le ayudaría a encontrar a menos que sea un caso trivial.

+1

Sí. Crea un gráfico de llamadas y busca ciclos. – ephemient

+0

Y espero que no haya devoluciones de llamada del sistema operativo involucradas en la recursión;) – Cogwheel

4

¿Qué le parece usar una herramienta de perfiles como RedGate's Ants profiler o dotTrace?

Ambos ofrecen pruebas gratuitas. Simplemente ejecute el código con el generador de perfiles ejecutándose y le mostrará rápidamente dónde se está gastando su tiempo/memoria.

Apuesto a que su función recursiva problemática sobresaldrá un poco.

Además, ¿qué marco de registro de errores está utilizando? En caso de que la respuesta sea ninguna, considere adoptar una. This Question deals with the options. Con un buen sistema, debería poder obtener el seguimiento de la pila que, si tiene suerte, puede darle pistas sobre dónde se produce la excepción.

+0

Tengo cientos de instalaciones en todo Estados Unidos, esta es la única instancia que me está dando ajustes. No puedo replicar el problema, pero me gustaría al menos acercarme a él, localizando la recursión – AngryHacker

6

Esta es una pregunta incontestable en el caso general. Excepto por los ejemplos más triviales (por ejemplo, una función que se llama directamente a sí misma), no hay forma de analizar un programa y determinar si ocurre la recursión. Deberá comenzar a utilizar el depurador u otras herramientas de tiempo de ejecución.

Este es un ejemplo del halting problem.

+1

Sí - Muy cierto. Sin embargo, los servicios de depuración son más complicados que las aplicaciones normales, lo que puede ser el motivo por el que preguntan. –

+0

Creo que lo exageras un poco. En la mayoría de los casos, creo que algunos análisis estáticos y algunos ciclos, esto no sería tan difícil. ¿Sería exhaustivo? No, pero creo que hacer un control práctico para esto no sería tan difícil. Sin embargo, usar una expresión regular no va a suceder. – Tim

+1

Creo que "algunos ciclos" se ajusta a los "ejemplos más triviales" que estaba tratando de transmitir. Pero sí, incluso entonces es probable que necesites un analizador completo solo para comenzar. – Cogwheel

2

Adjunte a the service in the debugger y depúrelo correctamente. Encontrará esto mucho más fácil que tratar de buscar el código de cualquier proyecto de tamaño razonable.

4

Acepto que una expresión regular no se va a cortar aquí.

Una forma más directa sería obtener un archivo de volcado y mirarlo para ver dónde se lanzó la excepción.

O puede consultar una herramienta de análisis estático como NDepend para examinar el flujo de programas.

1

La manera más fácil de hacer esto es obtener un rastro de la pila de lo que está fallando. El seguimiento de la pila se verá así:

Blah 
Foo 
Baz 
Hello 
... 
Frob 
Frob 
Frob 
Frob 
[several hundred more Frobs] 
Frob 
Frob 
... 
Frob 
Something -- crash! 

El "Frob" es la función recursiva. :-)