Descripción del depurador de .NET en Visual Studio Code

Completado

En la unidad anterior, aprendió que un depurador le ayuda a controlar la ejecución del programa y observar su estado. En esta sección, aprenderá a hacer ambas tareas en Visual Studio Code.

Comencemos por aprender a configurar el depurador de Visual Studio Code para usarlo con .NET.

Configuración de Visual Studio Code para la depuración de .NET

La primera vez que abra un archivo de C# en Visual Studio Code, recibirá un aviso para instalar las extensiones recomendadas para C#.

Screenshot of Visual Studio Code prompt to install the C# extension.

Visual Studio Code instalará la extensión de C# y mostrará otro aviso para agregar los recursos necesarios para compilar y depurar el proyecto.

Screenshot of Visual Studio Code prompt to add required assets to build and debug your .NET project.

Nota:

La compatibilidad con el lenguaje C# en Visual Studio Code es una instalación de Marketplace opcional. Si aún no lo ha hecho, Visual Studio Code le pedirá automáticamente que instale esta extensión cuando abra un archivo de C#. Si tiene problemas para compilar o depurar la aplicación .NET en Visual Studio Code, debe comprobar que el proyecto tenga los recursos necesarios para la compatibilidad con el lenguaje C#.

Puntos de interrupción

Como aprendió en la unidad anterior, un depurador le ayuda a analizar y controlar la ejecución del programa. Al iniciar el depurador de Visual Studio Code, comienza a ejecutarse el código inmediatamente. Dado que el código se ejecuta rápidamente, debe poder pausar el programa en cualquier instrucción. Para ello, usará puntos de interrupción.

Puede agregar un punto de interrupción en Visual Studio Code haciendo clic en el lado izquierdo del número de línea, en la línea que quiera interrumpir. Verá un círculo de color rojo después de habilitar el punto de interrupción. Para quitarlo, simplemente vuelva a seleccionar el círculo rojo.

Screenshot of a breakpoint added in the Visual Studio Code editor window.

Si hace clic con el botón derecho para agregar un punto de interrupción, también puede seleccionar la opción Agregar punto de interrupción condicional. Se trata de un tipo especial de punto de interrupción que permite especificar una condición para interrumpir la ejecución. Este punto de interrupción solo estará activo cuando se cumpla la condición especificada. También puede modificar un punto de interrupción existente si hace clic en él con el botón derecho y selecciona Editar punto de interrupción.

Screenshot of setting a conditional breakpoint in Visual Studio Code.

Información general del depurador de Visual Studio Code

Después de configurar los puntos de interrupción e iniciar la aplicación, en la pantalla aparecen nuevos paneles de información y controles.

Screenshot of Visual Studio Code debugger overview.

  1. Controles de inicio del depurador
  2. Estado de las variables
  3. Estado de las variables inspeccionadas
  4. Pila de llamadas actual
  5. Puntos de interrupción
  6. Controles de ejecución
  7. Paso de ejecución actual
  8. Consola de depuración

Controles de inicio del depurador

En la parte superior de la barra lateral, encontrará los controles de inicio:

Screenshot of Visual Studio Code debug sidebar controls.

  1. Inicie la depuración.
  2. Seleccione la configuración de inicio activa.
  3. Edite el archivo launch.json. Créelo si es necesario.
  4. Abra el terminal de depuración.

Visualización y edición del estado de las variables

Al analizar la causa de un defecto del programa, consulte el estado de las variables en busca de cambios inesperados. Puede usar el panel Variables para hacerlo.

Las variables se muestran organizadas por ámbito:

  • Las variables locales son aquellas a las que se puede acceder en el ámbito actual, normalmente la función actual.
  • Las variables globales son aquellas a las que se puede acceder desde cualquier parte del programa. También se incluyen los objetos del sistema del entorno de ejecución de JavaScript, por lo que no debe sorprenderse si aquí ve una gran cantidad de elementos.
  • Las variables de clausura son aquellas a las que se accede desde la clausura actual, si hay alguna. Una clausura combina el ámbito local de una función con el ámbito de la función externa a la que pertenece.

Puede desplegar los ámbitos y las variables seleccionando la flecha. Al desplegar objetos, puede ver todas las propiedades definidas en el objeto.

Es posible cambiar el valor de una variable sobre la marcha haciendo doble clic en ella.

Al mantener el puntero sobre un parámetro de función o una variable directamente en la ventana del editor, también podrá inspeccionar su valor.

Screenshot of variable hover during debugging.

Inspección de variables

Puede resultar tedioso hacer una búsqueda cada vez que quiere realizar el seguimiento del estado de una variable en el tiempo o en distintas funciones. Por eso resulta tan útil el panel Inspección.

Puede seleccionar el botón más para escribir un nombre de variable o una expresión que quiera inspeccionar. Otra opción es hacer clic con el botón derecho en una variable en el panel Variables y seleccionar Agregar a inspección.

Todas las expresiones que se encuentran dentro del panel de inspección se actualizan automáticamente a medida que se ejecuta el código.

Pila de llamadas

Cada vez que el programa especifique una función, se agregará una entrada a la pila de llamadas. Cuando la aplicación se vuelva compleja y se llame a funciones dentro de otras funciones de forma repetida, la pila de llamadas representará el rastro de las llamadas a las funciones.

Esto resulta útil para buscar el origen de una excepción. Si se produce un bloqueo inesperado en el programa, verá algo parecido al ejemplo siguiente en la consola:

Unhandled exception. System.IndexOutOfRangeException: Index was outside the bounds of the array.
   at OrderProcessor.OrderQueue.ProcessNewOrders(String[] orderIds) in C:\Users\Repos\OrderProcessor\OrderQueue.cs:line 12
   at OrderProcessor.Program.Main(String[] args) in C:\Users\Repos\OrderProcessor\Program.cs:line 9

El grupo de líneas at [...] situado debajo del mensaje de error se denomina seguimiento de la pila. Proporciona el nombre y el origen de cada función a la que se ha llamado antes de terminar con la excepción. Puede ser algo difícil de descifrar, ya que también incluye funciones internas del entorno de ejecución de .NET.

Aquí es donde resulta práctico el panel Pila de llamadas de Visual Studio Code. Filtra la información no deseada y le muestra solo las funciones pertinentes de su código de forma predeterminada. Después, puede desenredar esta pila de llamadas para averiguar dónde se originó la excepción.

Panel Puntos de interrupción

En el panel Puntos de interrupción, puede ver todos los puntos de interrupción que haya colocado en el código y alternar entre ellos. También puede alternar entre las opciones para interrumpir las excepciones, tanto las detectadas como las no detectadas. Puede usar el panel Puntos de interrupción para examinar el estado del programa y localizar el origen de una excepción cuando se produzca mediante la pila de llamadas.

Control de la ejecución

Puede controlar el flujo de ejecución del programa mediante estos controles.

Screenshot of Visual Studio Code debugger execution controls.

Estos son los controles, de izquierda a derecha:

  • Continuar o pausar la ejecución: Si la ejecución está en pausa, continuará hasta que se alcance el siguiente punto de interrupción. Si el programa se está ejecutando, el botón se convertirá en un botón de pausa que puede usar para pausar la ejecución.
  • Depurar paso a paso por procedimientos: Ejecuta la siguiente instrucción de código en el contexto actual.
  • Depurar paso a paso por instrucciones: Es igual que Depurar paso a paso por procedimientos, pero, si la siguiente instrucción es una llamada de función, pasa a la primera instrucción de código de esta función (igual que el comando step).
  • Depurar paso a paso para salir: Si está dentro de una función, ejecuta el código restante de esta y vuelve a la instrucción después de la llamada de función inicial (igual que el comando out).
  • Reiniciar: Reinicia el programa desde el principio.
  • Detener: Finaliza la ejecución y sale del depurador.

Uso de la consola de depuración

Puede mostrar u ocultar la consola de depuración; para ello, seleccione Ctrl+Mayús+Y para Windows y Linux. En Mac, presione Cmd+Mayús+Y. Puede usar la consola de depuración para visualizar los registros de la consola de la aplicación. También puede usarla para evaluar expresiones o ejecutar código en el contenido de ejecución actual, como comandos o nombres de variables en el depurador integrado de .NET.

Puede escribir una expresión de .NET en el campo de entrada en la parte inferior de la consola de depuración y presionar ENTRAR para evaluarla. El resultado se muestra directamente en la consola.

Screenshot of Visual Studio Code debug console.

Mediante el uso de la consola de depuración, puede comprobar rápidamente el valor de una variable, probar una función con valores diferentes o modificar el estado actual.

Nota:

Aunque la consola de depuración es muy útil para ejecutar y evaluar código .NET, puede ser un poco confusa al intentar ejecutar o depurar una aplicación de consola de .NET, porque la consola de depuración no acepta entradas de terminal para un programa en ejecución.

Para controlar la entrada de terminal durante la depuración, puede usar el terminal integrado (una de las ventanas de Visual Studio Code) o un terminal externo. En este tutorial, usará el terminal integrado.

  1. Abra .vscode/launch.json.

  2. Cambie la configuración de console a integratedTerminal. De:

    "console": "internalConsole",
    

    A:

    "console": "integratedTerminal",
    
  3. Guarde los cambios.

En la siguiente unidad, aprenderá a usar el depurador para corregir el error en el código de Fibonacci que vimos anteriormente.