Registro de información en la ventana de salida mediante puntos de seguimiento en Visual Studio

Los puntos de seguimiento permiten registrar información en la ventana de salida en condiciones configurables sin necesidad de modificar ni detener el código. Esta característica es compatible tanto con los lenguajes administrados (C#, Visual Basic, F#) como con el código nativo, así como lenguajes como JavaScript y Python.

Nota:

Para obtener información sobre el registro de información en la ventana Salida mediante programación con las API de .NET, vea Enviar mensajes a la ventanaSalida.

Veamos un ejemplo

El programa de ejemplo siguiente es un bucle for sencillo con una variable de contador que se incrementa en uno cada vez que el bucle ejecuta otra iteración.

Screenshot of a sample counter program.

El programa de ejemplo siguiente es un bucle for sencillo con una variable de contador que se incrementa en uno cada vez que el bucle ejecuta otra iteración.


using System.Diagnostics;

namespace Tracepoints
{
    public class Program
    {
        public static void Main(string[] args)
        {
            int counter = 0;
            for (int i=0; i<=10; i++)
            {
                counter +=1;
            }
        }
    }
}

Establecimiento de puntos de seguimiento en el código fuente

Para establecer puntos de seguimiento, especifique una cadena de salida en la casilla Acciones de la ventana Configuración del punto de interrupción.

  1. Para inicializar un punto de seguimiento, primero haga clic en el medianil que se encuentra a la izquierda del número de línea donde quiere establecer el punto de seguimiento.

    Screenshot showing the Breakpoint Initialization in the sample code.

  2. Mantenga el mouse sobre el círculo rojo y haga clic en el icono de engranaje.

  3. Esta acción abre la ventana Configuración del punto de interrupción.

    Screenshot showing Breakpoint Window.

  4. Active la casilla Acciones.

    Screenshot of breakpoint window with Actions Box checked.

    Observe que el círculo rojo cambia a un diamante que indica que pasó de un punto de interrupción a un punto de seguimiento.

  5. Escriba el mensaje que quiere registrar en el cuadro de texto Mostrar un mensaje en la ventana de salida (para detalles, consulte las secciones que aparecen más adelante en este artículo).

    El punto de seguimiento ya se estableció. Presione el botón "Cerrar" si solo quiere registrar información en la ventana de salida.

  6. Si quiere agregar condiciones que determinen si se muestra el mensaje, active la casilla Condiciones.

    Screenshot of breakpoint window with Conditions Box checked.

    Tiene tres opciones para las condiciones: Expresión condicional, Filtro y Número de llamadas.

Para establecer puntos de seguimiento, especifique una cadena de salida en la casilla Acciones de la ventana Configuración del punto de interrupción.

  1. Para inicializar un punto de seguimiento, primero haga clic en el medianil que se encuentra a la izquierda del número de línea donde quiere establecer el punto de seguimiento.

    Screenshot showing the Breakpoint Initialization in the sample code.

  2. Mantenga el puntero sobre el círculo rojo y haga clic en el icono de engranaje para abrir la ventana Configuración del punto de interrupción.

    Screenshot showing Breakpoint Window.

  3. Active la casilla Acciones.

    Screenshot of breakpoint window with Actions Box checked.

    Observe que el círculo rojo cambia a un diamante que indica que pasó de un punto de interrupción a un punto de seguimiento.

  4. Escriba el mensaje que quiere registrar en el cuadro de texto Mostrar un mensaje en la ventana de salida (para detalles, consulte las secciones que aparecen más adelante en este artículo).

    El punto de seguimiento ya se estableció. Presione el botón "Cerrar" si solo quiere registrar información en la ventana de salida.

  5. Si quiere agregar condiciones que determinen si se muestra el mensaje, active la casilla Condiciones.

    Screenshot of breakpoint window with Conditions Box checked.

    Tiene tres opciones para las condiciones: Expresión condicional, Filtro y Número de llamadas.

Menú Acciones

Este menú le permite registrar un mensaje en la ventana de salida. Escriba las cadenas que quiere mostrar en el cuadro de mensaje (no se necesitan comillas). Si quiere mostrar los valores de las variables, asegúrese de encerrar la variable entre llaves.

Por ejemplo, si quiere mostrar el valor de la variable counter en la consola de salida, escriba {counter} en el cuadro de texto del mensaje.

Screenshot showing Counter Output Message.

Si hace clic en Cerrar y luego depura el programa (F5), verá la salida siguiente en la ventana de salida.

Screenshot showing Actions Message In Output Window.

También puede usar palabras clave especiales para mostrar información más específica. Escriba la palabra clave tal como se mostró anteriormente (use un carácter "$" antes de cada palabra clave, que debe estar escrita completamente en mayúsculas).

Palabra clave Qué se muestra
$ADDRESS Instrucción actual
$CALLER Nombre de la función de llamada
$CALLSTACK Pila de llamadas
$FUNCTION Nombre de la función actual
$PID Identificador del proceso
$PNAME Nombre del proceso
$TID Id. de subproceso
$TNAME Nombre del subproceso
$TICK Contador de réplica (de GetTickCount de Windows)

Este menú le permite registrar un mensaje en la ventana de salida. Escriba las cadenas que quiere mostrar en el cuadro de mensaje (no se necesitan comillas). Si quiere mostrar los valores de las variables, asegúrese de encerrar la variable entre llaves.

Por ejemplo, si quiere mostrar el valor de la variable counter en la consola de salida, escriba {counter} en el cuadro de texto del mensaje.

Screenshot showing Counter Output Message.

Si hace clic en Cerrar y luego depura el programa (F5), verá la salida siguiente en la ventana de salida.

Screenshot showing Actions Message In Output Window.

También puede usar palabras clave especiales para mostrar información más específica. Escriba la palabra clave tal como se mostró anteriormente (use un carácter "$" antes de cada palabra clave, que debe estar escrita completamente en mayúsculas).

Palabra clave Qué se muestra
$ADDRESS Instrucción actual
$CALLER Nombre de la función de llamada
$CALLSTACK Pila de llamadas
$FUNCTION Nombre de la función actual
$PID Identificador del proceso
$PNAME Nombre del proceso
$TID Id. de subproceso
$TNAME Nombre del subproceso
$TICK Contador de réplica (de GetTickCount de Windows)

Menú de condiciones

Las condiciones permiten filtrar los mensajes de salida, por lo que solo se muestran en determinados escenarios. Hay tres tipos principales de condiciones disponibles.

Expresión condicional

En el caso de una expresión condicional, se muestra un mensaje de salida solo cuando se cumplen ciertas condiciones.

Para las expresiones condicionales, puede establecer el punto de seguimiento para que se genere un mensaje cuando una condición determinada sea verdadera o cuando se haya modificado. Por ejemplo, si solo quiere mostrar el valor del contador durante las iteraciones pares del bucle for, puede seleccionar la opción Is true y escribir i%2 == 0 en el cuadro de texto del mensaje.

Screenshot showing Conditional Expression Is True.

Si quiere imprimir el valor del contador cuando la interación del bucle for cambia, seleccione la opción When changed y escriba i en el cuadro de texto del mensaje.

Screenshot showing when Conditional Expression is Changed.

El comportamiento de la opción When changed es distinto según el lenguaje de programación.

  • El depurador no considerará la primera evaluación de la condición como cambio, por lo que no se llega al punto de seguimiento en la primera evaluación.
  • En el código administrado, el depurador visita el punto de seguimiento en la primera evaluación después de que se selecciona When changed.

Para una visión más completa de las expresiones válidas que se pueden usar al establecer las condiciones, consulte Expresiones en el depurador.

En el caso de una expresión condicional, se muestra un mensaje de salida solo cuando se cumplen ciertas condiciones.

Para las expresiones condicionales, puede establecer el punto de seguimiento para que se genere un mensaje cuando una condición determinada sea verdadera o cuando se haya modificado. Por ejemplo, si solo quiere mostrar el valor del contador durante las iteraciones pares del bucle for, puede seleccionar la opción Is true y escribir i%2 == 0 en el cuadro de texto del mensaje.

Screenshot showing Conditional Expression Is True.

Si quiere imprimir el valor del contador cuando la interación del bucle for cambia, seleccione la opción When changed y escriba i en el cuadro de texto del mensaje.

Screenshot showing when Conditional Expression is Changed.

El comportamiento de la opción When changed es distinto según el lenguaje de programación.

  • El depurador no considerará la primera evaluación de la condición como cambio, por lo que no se llega al punto de seguimiento en la primera evaluación.
  • En el código administrado, el depurador visita el punto de seguimiento en la primera evaluación después de que se selecciona When changed.

También puede establecer la condición cuando se pueda habilitar el punto de seguimiento insertando un punto de interrupción en cualquier sección concreta del código y seleccionando la casilla Habilitar solo cuando se alcance el siguiente punto de interrupción: en el menú Configuración del punto de interrupción. Puede elegir cualquier punto de interrupción de la lista de opciones.

Screenshot showing enable when a breakpoint is hit checked.

Para una visión más completa de las expresiones válidas que se pueden usar al establecer las condiciones, consulte Expresiones en el depurador.

Número de llamadas

Una condición de número de llamadas permite enviar la salida solo después de que la línea de código donde se establece el punto de seguimiento se haya ejecutado un número especificado de veces.

Para el número de llamadas, puede optar por generar un mensaje cuando la línea de código donde se establece el punto de seguimiento se haya ejecutado un número determinado de veces. En función del requisito, puede ser igual que, un múltiplo de o mayor que o igual que el valor del número de llamadas especificado. Elija la opción que mejor se adapte a sus necesidades y escriba un valor entero en el campo (por ejemplo, 5) que represente la iteración de interés.

Screenshot showing Conditional Expression Hit Count.

Una condición de número de llamadas permite enviar la salida solo después de que la línea de código donde se establece el punto de seguimiento se haya ejecutado un número especificado de veces.

Para el número de llamadas, puede optar por generar un mensaje cuando la línea de código donde se establece el punto de seguimiento se haya ejecutado un número determinado de veces. En función del requisito, puede ser igual que, un múltiplo de o mayor que o igual que el valor del número de llamadas especificado. Elija la opción que mejor se adapte a sus necesidades y escriba un valor entero en el campo (por ejemplo, 5) que represente la iteración de interés.

Screenshot showing Conditional Expression Hit Count.

También puede quitar el punto de interrupción en la línea ejecutada habilitando la casilla Quitar punto de interrupción una vez alcanzado.

Screenshot showing Remove breakpoint on first hit.

Filtra

En el caso de una condición de filtro, especifique para qué dispositivos, procesos o subprocesos se muestra la salida.

Screenshot showing Conditional Expression Filter.

Lista de las expresiones de filtro:

  • MachineName = "name"
  • ProcessId = value
  • ProcessName = "name"
  • ThreadId = value
  • ThreadName = "name"

Escriba las cadenas (como los nombres) entre comillas dobles. Los valores se pueden escribir sin comillas. Puede combinar las cláusulas con & (AND), || (OR), ! (NOT) y paréntesis.

En el caso de una condición de filtro, especifique para qué dispositivos, procesos o subprocesos se muestra la salida.

Screenshot showing Conditional Expression Filter.

Lista de las expresiones de filtro:

  • MachineName = "nombre"
  • ProcessId = valor
  • ProcessName = "nombre"
  • ThreadId = valor
  • ThreadName = "nombre"

Escriba las cadenas (como los nombres) entre comillas dobles. Los valores se pueden escribir sin comillas. Puede combinar las cláusulas con & (AND), || (OR), ! (NOT) y paréntesis.

Consideraciones

Los puntos de seguimiento están diseñados para hacer que la depuración sea más limpia y una experiencia más fluida. Hay algunas consideraciones que debe tener en cuenta cuando los use.

A veces, cuando inspecciona alguna propiedad o atributo de un objeto, es posible que su valor cambie. Si el valor cambia durante la inspección, no es un error causado por la característica de punto de seguimiento misma. Sin embargo, el uso de puntos de seguimiento para inspeccionar objetos no impide estas modificaciones accidentales.

La manera en que las expresiones se evalúan en el cuadro de mensaje Acción puede ser distinto del lenguaje que usa actualmente para desarrollo. Para generar una cadena, por ejemplo, no necesita encapsular un mensaje entre comillas incluso si lo haría habitualmente al usar Debug.WriteLine() o console.log(). Además, la sintaxis de llaves ({ }) para generar expresiones también puede ser distinta de la convención para generar valores en el lenguaje de desarrollo que esté usando. (Sin embargo, el contenido dentro de las llaves ({ }) de todos modos se debe escribir según la sintaxis del lenguaje de desarrollo).

Si intenta depurar una aplicación activa y busca una característica similar, revise la característica de punto de registro de Snapshot Debugger. Snapshot Debugger es una herramienta que se usa para investigar problemas en aplicaciones de producción. Los puntos de registro también permiten enviar mensajes a la ventana de salida sin tener que modificar el código fuente y no afecta a la aplicación en ejecución. Para más información, consulte Depuración de aplicaciones activas de Azure.