Depuración 3 – Breakpoints
Una vez que tenemos completamente configurado el entorno de depuración podemos hacer una aplicación de ejemplo para probar que realmente lo tenemos todo configurado.
1: using System;
2: using System.Collections.Generic;
3: using System.Linq;
4: using System.Text;
5:
6: namespace ConsoleApplication1
7: {
8: class Program
9: {
10: static void Main(string[] args)
11: {
12: string[] values = new string[] { "uno", "dos",
"tres", "cuatro", "cinco" };
13: for (int x = 0; x < values.Length; x++)
14: {
15: Console.WriteLine(values[x]);
16: }
17: }
18: }
19: }
Con esta aplicación podemos comprobar si tenemos bien configurado el servidor de símbolos de Microsoft para ello tenemos que establecer un punto de interrupción en algún punto del código fuente y pulsar F5, entonces Visual Studio aparecerá así.
Si nos fijamos bien tenemos el depurador parado en la línea 15 en la sentencia Console.WriteLine(values[x]); podemos ver abajo las lista con los hilos (Threads) de la aplicación y a la derecha la pila de llamadas (Call Stack), si nos fijamos en la pila de llamadas vemos como algunos de los marcos están en gris y otros están en negro. Las funciones que estan en gris significa que no tenemos el código fuente disponible y no podemos ver el código fuente origina, para los que están en negro podemos ver el fichero de código fuente original para depurarlo como si fuera de nuestro proyecto.
Esta aplicación de ejemplo es una aplicación de Consola, si nos fijamos en la pila de llamadas vemos que la primera de las funciones que se invoca está en mscorlib.dll (es el ensamblado principal de .net framework) y llama a la función System.Threading.ThreadHelper.ThreadStart() además VS nos dice que esa función esta en la linea 82 y tiene un desplazamiento de 0x20 bytes. Si hacemos doble clic encima de esa línea de la pila de llamadas podemos acceder a código fuente de la clase ThreadHelper. Lo podemos ver aquí.
Si nos fijamos de nuevo en la pila de llamadas del proceso podemos ver que ahora el marco que está seleccionado es justamente el de mscorlib.dllSystem.Threading.ThreadHelper.ThreadStart() Line 82 + 0x20 bytes, y además en la vista de código podemos ver el fichero del código fuente original, en C#, de la clase ThreadHelper.
Para poder llegar a ver la información que tenemos disponible se ha tenido que establecer un breakpoint para que la aplicación se pare en ese momento y podamos examinar los datos. Los puntos de interrupción son unos de los métodos por el cual una aplicación puede parar su ejecución, además de este hay otros. Los breakpoints en Visual Studio además de establecerlos nos permiten una serie de funcionalidad añadida, podemos eliminarlos o deshabilitarlos, y además podemos establecer información condicional para personalizar nuestro breakpoint. Que podemos hacer con un breakpoint, si pulsamos con el botón contrario encima del círculo rojo de la derecha del código, nos aparece un menú contextual con una serie de opciones.
- Location:
- Especifica donde está establecido el breakpoint, el fichero, la línea y el carácter.
- Condition:
- Esta es una de las opciones más interesantes. Esta opción permite establecer una condición en la cual el breakpoint se tiene que parar. Eso que significa que podemos poner una expresión boleana que Visual Studio evaluará para determinar si el breakpoint se parará. En el ejemplo que nosotros tenemos podemos poner una condición para que se pare cuando el valor actual es: tres.
-
- Hit Count:
- Determina cuantas veces se se tiene que pasar por el breakpoint antes de que se pare, es algo útil si queremos para en un bucle en un valor determinado.
- Filter:
- Permite establecer un filtro a partir de una serie de valores de entorno predeterminados, es como la condición pero con valores que Visual Studio nos proporciona.
- When Hit:
- Esta opción se utiliza si queremos que Visual Studio, imprima un mensaje en la salida con un determinado valor, o queremos que ejecute una macro.
Con esto damos por concluido la configuración del entorno de depuración de .net dentro de Visual Studio.
Depuración 2
En el post anterior comentábamos como es el entorno de depuración, las herramientas que necesitamos y la configuración para el servidor de símbolos de Microsoft. En este segundo post vamos a configurar el servidor de código fuente para el .net Framework 3.5 dentro de Visual Studio 2008.
Ya digimos antes que Visual Studio 2008 es tanto el entorno de programación, como un entorno de depuración de aplicaciones, con lo que vamos a configurarlo para tener el entorno perfecto para depurar nuestras aplicaciones en .net. Para ello empezaremos por el menú de opciones que se encuentra en Herramientas -> Opciones.
Una vez abierto el cuadro de dialogo tenemos que desplazarnos hasta Depuración, una vez allí tenemos (a la derecha) una serie de opciones que podemos configurar. Vamos a ver brevemente que impacto tienen esas opciones en nuestra experiencia de depuración.
• Enable Just My Code (Managed only): Esta opcion habilita si se puede depurar únicamente nuestro código o también el código de terceros, véase el código de framework o ensamblados que tengamos referenciados en nuestro proyecto. Esta opción tiene que estar deshabilitada si queremos depurar el código fuente que Microsoft nos proporciona.
• Enable source server support: Esta opción habilita el soporte para el servidor de codigo dentro de Visual Studio, para poder utilizar el servidor de codigo fuente de Microsoft es necesario habilitar esta opción.
• Require source files to exactly match the original versión: Cuando estamos depurando dentro de Visual Studio par que el depurador se pare en un punto de interrupción y muestre el código fuente de la aplicación el fichero actual y el código compilado tienen que ser iguales, sino VS no mostrará el código fuente. Esta opción se tiene que deshabilitar porque en el caso del .Net Framework, se compila de una manera especial y se eliminan algunas referencias del código fuente original, con lo que VS no va a ser capaz de saber que ese código fuente es exactamente el que el servidor de código se descarga.
• Suppress JIT optmization on module load (Managed Only): Cuando una aplicación se ejecuta, normalmente el JIT realiza una serie de optimizaciones en la compilación para que el rendimiento sea mejor, esto puede que sea un problema si estamos intentando depurar el código x86 que genera el JIT con SOS. Esto únicamente se refiere al código que se genera dentro del JIT porque si el ensamblado que se ha cargado en memoria ha sido precompilado con ngen ese código no pasará con el JIT.
Una vez que se han establecido esas opciones, lo que hay que hacer es irse dentro de la categoría de depuración, a símbolos, en la que nos aparece una serie de opciones a la derecha.
• En la lista de localizaciones de simbolos de depuración (*.pdb) tenemos que introducir una entrada, que es justamente el servidor de código fuente de Microsoft, cuya dirección es: http://referencesource.microsoft.com/symbols
• En la caja de texto de debajo tenemos que especificar cuál es el directorio en el que queremos que se almacenen los símbolos descargados desde el servidor de símbolos. En el post anterior establecíamos ese directorio en c:\symbols así que podemos hacerlo aquí también.
La información completa de cómo se configura el servidor de símbolos de Microsoft lo tenéis en esta dirección:
http://blogs.msdn.com/sburke/archive/2008/01/16/configuring-visual-studio-to-debug-net-framework-source-code.aspx
Depuración
Como parte del proceso de creación de software, la depuración es esa cosa que fastidia mucha gente pero que a mí me encanta. Depurar es un arte no lo podemos negar, y como tal hay que saberlo, así que aquí van una serie de post en los cuales quiero hablar de la depuración de aplicaciones, tanto desde el punto del vista del mundo administrado como desde el punto de vista no administrado.
La primera pregunta es porque depurar. Depurar nos ayuda a corregir problemas de software y a comprobar que todo funciona correctamente. Básicamente es su principal función, aunque tiene otras que veremos más adelante. Todos los ejemplo que voy a facilitar son para .net en C#.
En esta serie de artículos hablaré sobre el depurador de Visual Studio que viene integrado en el IDE, y el Debuggins tools for Windows (Windbg) que es depurador de Microsoft para el S.O. Se pueden hacer varios tipos de depuración administrada, la cual es únicamente para el mundo .net, nativa en el que depuramos código en ensamblador y mixta. Puede que alguien eche en falta algún tipo de depuración más, como por ejemplo SQL o Silverlight o incluso depuración del kernel, pero como ya he dicho solo hablaré sobre .net.
Dentro de estos tipos de depuración algunas se pueden mezclar, por ejemplo, podemos estar depurando una aplicación hecha en C# y además depurar también el código x86 que genera el JIT, o podemos estar depurando una aplicación .net como si fuera nativa y además depurar el código administrado. Esto depende del depurador que usemos y de la configuración del mismo, prácticamente se pueden obtener los mismos resultados por ambas partes.
Lo primero que hay que hacer es configurarse un buen entorno de depuración para eso necesitamos una serie de herramientas para conseguir el entorno adecuado.
Software que hay que tener:
• http://msdn2.microsoft.com/es-es/vstudio/default.aspx
• http://www.microsoft.com/whdc/devtools/debugging/installx86.mspx
• http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx
Una vez instalado este software tenemos que configurar el servidor de símbolos de Microsoft. Este servidor de símbolos se descargará la información de depuración de todos los módulos (DLL) de Windows y de todos los ensamblados de .Net. Para ello tenemos que crear una variable de entorno y crear una carpeta local donde se vayan descargando esos símbolos para tenernos offline y que en el proceso de depuración no tengamos que descargarlos cada vez. La configuración sería:
• _NT_SYMBOL_PATH
• SRV*c:\symbols*http://msdl.microsoft.com/download/symbols
Dentro de valor aparece una ruta local c:\symbols, ahí es donde se van a guardar todos los símbolos que nos descarguemos del servidor de Microsoft durante nuestra sesión de depuración.
Una vez que tenemos eso podemos empezar a depurar tanto con VS2008 y con WinDbg. En el siguiente articulo explicaré como depurar con el código fuente del .Net Framework que Microsoft proporciona a través de otro servidor de símbolos.
Saludos y feliz depuración.