viernes, 21 de agosto de 2009

Primeros pasos debugando de verdad

El otro dia nos encontramos con un problema en el trabajo. Teniamos una aplicación que cascaba aleatoriamente y no sabíamos por que. Teníamos que encontrar el problema y solucionarlo de manera urgente o algún cliente estaria muy pero que muy enfadado.

Como profanos en la materia empezamos nuestro estudio con nuestro amigo el Administrador de Tareas de windows. Un vistazo a la memória del proceso y al máximo de memória nos hacía pensar que alguna acción de nuestra aplicación hacia que la memória tubiera picos que después se recuperaban. En uno de estos picos, la aplicación acababa diciendo basta y empezaba a funcionar muy mal, llegando a cerrarse. Como primer paso no estaba mal, pero no teniamos ni idea de cómo solucionarlo.

Después de un rato navegando por internet buscando información sobre profilers nos decidimos a probar el windbg. Algunos artículos de los grandes Rodrigo Corral, Pablo Doval y David Salgado nos ayudaron a hacer nuestros primeros pinitos con la herramienta, pero todavía no eramos lo suficientemente hombres cómo para utilizarla correctamente, así que buscamos alguna otra manera de hacerlo.

Llegamos a este artículo de Rodrigo donde se comenta cómo determinar que tipo de problema de memoria tiene una aplicación. Pusimos los tres contadores en la máquina de preproducción ( bytes privados del proceso, bytes en todos los montones y colecciones de generación 2 ) y lo que parecía indicar el gráfico resultate ( ver imágen ) es que no teniamos una fuga de memoria ( o por lo menos no era nuestro mayor problema ) sinó que teniamos un incremento escandaloso de memoria manejada. Esto nos llevó directos a la segunda parte del artículo de Rodrigo, donde se habla de la herramienta CLRProfiler. Con esta herramienta pudimos ver que función era la que creaba el problema.



Lo que hacía la función era cargar un archivo en memoria para calcularle un MD5. Cómo esta operación se podia realizar a la vez en unos 50 ficheros que podian llegar a los 5MB, el incremento de memoria que tenia el sistema era preocupante. Modificamos esta función para no cargar todo el archivo y hacerla más liviana y el problema se vió reducido a la nada.

Esto es sólo el principio de lo que esperamos sea un aprendizaje de todas estas herramientas y de las entrañas del CLR. Intentaremos ir posteando nuestras experiéncias y las cosas que vayamos aprendiendo.

Saludos!