Angel Hernández

Some useful debugging tips / Algunos tips útiles para depuración

Last year 2008 was challenging, amazing and exciting all at the same time.  I’ve had a lot of interesting experiences and situations alike that goes from moving countries (Venezuela to Australia), joining CustomWare, my first speaking engagement in Tech-Ed and so on. I’ve learned a lot generally speaking so I hope this year 2009 can be better than the previous one.  As developers, we can’t escape the fact that our code is not bug free (we wish it was but life ain’t perfect) so this post is about some useful debugging tips and options we have available

Option #1 – Visual Studio .NET Debugger

This is our first line of defense, but it’s missing 99% of the times on a production environment.  It allows to set breakpoints, add watches, evaluate expressions, view memory and its disassembly and something even cooler… We can step into .NET Framework code (Image 1)

Option #2 – CorDebug

It’s a pretty cool tool which allows us to debug .NET code using the command line. It takes some time to get used to the commands but once we do it, it’s pretty straightforward. It’s highly recommended to have the symbols files (PDB) required to step into the code. If we don’t have it then we’re going to see the code in Assembler. Let’s take as an example the Test.cs source file (Image 2), it’s a very simple application written with “Visual” Notepad.

Then we’re going to compile it using the CSC from the Command Prompt. We can either generate symbols/debug information or not with the following switches:

· Generate Debug Information

csc test.cs /platform:x64 /debug

· Don’t generate any Debug Information

csc test.cs /platform:x64

Once we’ve built our assembly/application we can launch CorDebug and start debugging it. We can either let CorDebug launch the application for us or we can attach it to the selected process by ourselves. Image 3 depicts the CorDebug “interface”. 

The yellow rounded rectangles indicate:

1. Listing of managed applications running

2. Attach the debugger to process 1372

We can execute ? anytime to get information about available commands. The following image shows CorDbg launching the application for us and we step into the code (The lines are retrieved from the PDB file and code executed outside our program is displayed in Assembler). The colour reference (Image 4) for the rounded rectangles is:

· Light Green: CorDbg launching c:\test.exe

· Light Blue: Assemblies loaded

· Yellow: Stepping into the code

· Red: Displaying and modifying variables

· Grey: Stack trace at that moment

· Cyan: Modules loaded plus Application Domain ID

Option #3 – WinDbg (Windows Debugging Tools)

It’s a multipurpose debugger that can be used to debug user mode applications, drivers and the operating system itself in kernel mode. It’s very useful to debug kernel-mode memory dumps, created after an application crashes or when experiencing a “BSoD”. This tool allows to step into the code if PDB (symbol file) is present (Image 5).

WinDbg allows loading of extension DLLs that can augment the debugger's supported commands and allow for help in debugging specific scenarios: for example, displaying an MSXML document given an IXMLDOMDocument, or debugging the Common Language Runtime (CLR). These extensions are a large part of what makes WinDbg such a powerful debugger. WinDbg is used by the Microsoft Windows product team to build Windows, and everything needed to debug Windows is included in these extension DLLs.

Option #4 – CLR Profiler

Believe it or not but this tool helped me a lot 4 years ago when one of the projects I was engaged on at that time started to act “weird”… By using CLR Profiler and Windows Monitoring and Performance tools I was able to find a memory leak issue with BSTR objects. CLRProfiler is a tool that you can use to analyze the behavior of your managed applications which is focused on analyzing what is going on in the garbage collector heap (Image 6) and you can get an overview  of your application’s memory usage (Image 7).

Option #5 – .NET Reflector

Originally developed by Lutz Roeder and now by Red Gate Software, this tool is really handy and a “must-have” in every .NET developer toolbox because it allows you to Disassemble and analyze .NET assemblies (Image 8) so you can check and step into .NET code without having the source files.

Option #6 –  Fiddler

Have you ever wanted to sniff HTTP requests/responses? If that’s the case then you might find Fiddler useful. It’s a light-weight sniffing tool which allows developers see what’s happening between client/server HTTP transmission (Image

9)

Option #7 –  Microsoft NetMon (Network Monitor)

A couple of months ago I had an issue related to Kerberos, it seemed that the Kerberos ticket was getting lost somewhere… My best choice for this kind of situations, NetMon (Image 10). It’s a complete sniffing and network monitoring tool by Microsoft.

Option #8 –  Windows’ performance and monitoring Tools

Task Manager, Performance Monitor can make our lives easier if we know how to use them and most important… Add the right performance counter to determine and detect any possible problem.

 

Hope this helps,

Kind regards,

Angel


El año pasado 2008 fue retador, interesante y emocionante todo al mismo tiempo. Tuve un montón de experiencias y situaciones por igual que van desde cambiar de países (de Venezuela para Australia), unirme a CustomWare, mis primeras charlas en Tech-Ed y pare usted de contar. He aprendido generalmente hablando así que espero que este año 2009 pueda ser mejor que el anterior. Como desarrolladores, no podemos escapar el hecho de que nuestro código no está libre de errores (así lo quisierámos pero la vida no es perfecta) por lo que este post trata sobre algunos tips y opciones que tenemos disponibles

Opción #1 – Depurador de Visual Studio .NET

Esta es nuestra primera línea de defensa, pero el 99% de las veces no está instalado en un ambiente de producción. Nos permite establecer puntos de interrupción, inspección de variables, evaluar expresiones, ver la memoria y su desensamblado y algo aún más chévere… Podemos ver código del .NET Framework (Imagen 1)

Opción #2 – CorDebug

Es una herramienta bien interesante que nos permite depurar código de .NET desde la línea de comandos. Toma algo de tiempo acostumbrarse a los comandos pero una vez que lo hacemos, es realmente sencillo. Es altamente recomendado tener los símbolos (PDB) requeridos para poder ver el código. Sí no lo tenemos entonces vamos a ver el código en Ensamblador. Ahora tomemos como ejemplo el archivo Test.cs (Imagen 2), es una aplicación bastante sencilla escrita con  “Visual” Notepad.

Luego vamos a compilarla utilizando CSC desde la línea de comandos. Podemos generar ó no símbolos (información de depuración) con los siguientes switches:

· Generar información de depuración

csc test.cs /platform:x64 /debug

· No generar información de depuración

csc test.cs /platform:x64

Una vez que hayamos generado nuestro ensamblaje/aplicación podemos ejecutar  CorDebug y comenzar a depurar. Podemos ejecutar la aplicación por nuestra cuenta ó podemos adjuntarlo al proceso seleccionado.La imagen 3 muestra la “interfaz” de CorDebug “. 

Los rectángulos amarillos indican:

1. Lista de aplicaciones administradas en ejecución

2. Adjuntar el depurador al proceso 1372

Podemos ejecutar ? en cualquier momento para obtener información de comandos disponibles. La siguiente imagen muestra a CorDbg lanzando la aplicación por nosotros y podemos ver el código (Las líneas de código se recuperan del archivo PDB y el código ejecutado fuera de nuestro programa es mostrado en Ensamblador). La referencia del color (Imagen 4) de los rectángulos es:

· Verde claro: CorDbg lanzando c:\test.exe

· Azul claro: Ensamblajes cargados

· Amarillo: Ejecución línea por línea del código

· Rojo: Mostrando y modificando variables

· Gris: Pila de llamadas al momento 

· Aguamarina: Módulos cargados además del ID AppDomain

Opción #3 – WinDbg (Windows Debugging Tools)

Es un depurador multi-propósito que puede ser utilizado para depurar aplicaciones en modo usuario,  controladores y al mismo sistema operativo en modo Kernel.  Es muy útil para depurar vaciados de memoria en modo Kernel, que son creados después de una aplicación haberse cerrado inesperadamente ó tras experimentar una “Pantalla Azul”.  Esta herramienta permite ejecutar el código línea por línea sí el archivo de símbolos (PDB) está presente (Imagen 5)

WinDbg permite cargar DLLs de extensión que pueden aumentar los comandos soportados por el depurador permitiendo así depurar en escenarios específicos: Por ejemplo,  mostrar un documento MSXML a partir de un objeto  IXMLDOMDocument ó inclusive depurar el Common Language Runtime (CLR). Estas extensiones hacen de  WinDbg un poderoso depurador.  WinDbg es utilizado por el equipo de desarrollo de Microsoft Windows y todo lo necesario para depurar Windows está incluído en estas DLLs de extensión.

Opción #4 – CLR Profiler

Creánlo ó no pero esta herramienta me ayudó mucho hace 4 años atrás cuando uno de los proyectos en los que estaba involucrado para ese entonces comenzó a actuar “raro”…  Al utilizar el CLR Profiler y las herramientas de rendimiento y monitoreo de Windows pude encontrar una fuga de memoria relacionada con objetos de tipo BSTR.  El CLR Profiler nos permite analizar lo que sucede en el montón del colector de basura (Imagen 6) así mismo podemos obtener un resumen del uso de la memoria por parte de la aplicación (Imagen 7).

Opción #5 – .NET Reflector

Originalmente desarrollado por  Lutz Roeder y ahora por Red Gate Software, esta herramienta es realmente útil y “necesaria-tener” en la caja de herramientas de cada desarrollador .NET ya que permite analizar y decompilar ensamblajes de .NET (Imagen 8) por lo que se puede chequear y revisar el código sin necesidad de tener los archivos fuentes.

Opción #6 –  Fiddler

¿Alguna vez has deseado escuchar solicitudes/respuestas basadas en HTTP? Sí es ese el caso, entonces encontrarás a Fiddler útil (Imagen 9).  Es una herramienta liviana para escuchar conversaciones basadas en HTTP entre el cliente y el servidor.

Opción #7 –  Microsoft NetMon (Network Monitor)

Hace un par de meses atrás se me presentó un problema relacionado con Kerberos, parecía que el ticket de Kerberos se estaba perdiendo en alguna parte… Mi mejor opción para ese tipo de situaciones, NetMon (Imagen 10). Es una herramienta completa para escuchar el tráfico y conversaciones en la Red.

Opción #8 –  Herramientas de rendimiento y monitoreo de Windows

El administrador de tareas y monitor de rendimiento pueden hacer nuestras vidas más fáciles si sabemos como usarlos y lo más importante… Agregar el contador de rendimiento adecuado para detectar y determinar cualquier posible problema.

 

Espero sea de utilidad,

Saludos cordiales,

Angel

image

Image 1 – Yes… We want to step into the Framework code :D

image

Image 2 – Simple application written in Visual “Notepad”  =)

image

Image 3 – Cordbg output

image

Image 4 – Cordbg output explained

 WinDbg

Image 5 – WinDbg x64 Interface

image

Image 6 – CLR Profiler displaying Heap graph

image

Image 7 – CLR Summary

image

Image 8 – .NET Reflector

image

Image 9 – Fiddler  

 

image

Image 10 – NetMon

Leave a Comment

(required) 

(required) 

(optional)

(required)