Compartir a través de


Usar el tipo correcto de punto de interrupción

En este artículo se muestra cómo usar diferentes tipos de puntos de interrupción en Visual Studio para mejorar la eficacia de la depuración. Trata varios escenarios en los que se pueden aplicar puntos de interrupción, como pausar la ejecución del código, registrar información y realizar un seguimiento de los cambios en los estados de las variables. En el artículo se explica cómo establecer puntos de interrupción condicionales, puntos de seguimiento, puntos de interrupción de datos, puntos de interrupción dependientes y puntos de interrupción temporales. También incluye instrucciones detalladas sobre cómo establecer puntos de interrupción de función. Esta guía es esencial para los desarrolladores que buscan aprovechar los puntos de interrupción para una depuración eficaz en Visual Studio.

Si no está familiarizado con el uso de puntos de interrupción en Visual Studio, consulte Introducción a los puntos de interrupción antes de pasar por este artículo.

Para obtener la mejor experiencia con esta documentación, elija el lenguaje de desarrollo o el entorno de ejecución preferidos en la lista de la parte superior del artículo.

Escenarios

En la tabla siguiente se muestran escenarios de depuración comunes para puntos de interrupción y el tipo de punto de interrupción recomendado para el escenario.

Escenario Descripción
¿Cómo se pausa la ejecución de código para inspeccionar una línea de código que puede contener un error? Establezca un punto de interrupción. Para obtener más información, vea Introducción a los puntos de interrupción.
¿Mi variable tiene un valor inesperado? O bien, ¿quiero inspeccionar mi aplicación cuando llegue a un estado específico? Pruebe un punto de interrupción condicional para controlar dónde y cuándo se activa un punto de interrupción mediante la lógica condicional. Haga clic con el botón derecho en un punto de interrupción para agregar condiciones. Establezca la condición como true cuando la variable es igual al valor inesperado. Para más información, vea Condiciones de punto de interrupción.
¿Cómo se registra la información en la ventana Salida en condiciones configurables sin modificar ni detener mi código? Los puntos de seguimiento permiten registrar información en la ventana Salida en condiciones configurables sin modificar ni detener el código. Para obtener más información, vea Usar puntos de seguimiento en el depurador de Visual Studio.
¿Cómo sé cuándo cambia el valor de la variable? Para C++, establezca un punto de interrupción de datos .
En las aplicaciones que usan .NET Core 3 y versiones posteriores, también se puede establecer un punto de interrupción de datos.
Otra posibilidad, solo en C# y F#, es realizar un seguimiento de un identificador de objeto con un punto de interrupción condicional.
¿Cómo puedo interrumpir la ejecución solo si se alcanza otro punto de interrupción? Establezca un punto de interrupción condicionado que detenga la ejecución solo si primero se alcanza otro punto de interrupción. Para más información, consulte Punto de interrupción dependiente.
¿Puedo alcanzar un punto de interrupción una sola vez? Establezca un punto de interrupción temporal que le permita interrumpir el código solo una vez. Para más información, consulte Punto de interrupción temporal.
¿Puedo pausar el código dentro de un bucle en una iteración determinada? Establezca un punto de interrupción dependiente que interrumpa la ejecución solo si se alcanza primero otro punto de interrupción. Para más información, vea Número de llamadas.
¿Puedo pausar el código al principio de una función cuando conozco el nombre de la función, pero no su ubicación? Esto se puede llevar a cabo con un punto de interrupción de función. Para más información, vea Establecer puntos de interrupción de función.
¿Puedo pausar el código al principio de varias funciones con el mismo nombre? Cuando tiene varias funciones con el mismo nombre (funciones sobrecargadas o funciones en proyectos diferentes), puede usar un punto de interrupción de función .

Acciones de punto de interrupción y puntos de seguimiento

Un punto de seguimiento es un punto de interrupción que imprime un mensaje en la ventana Salida. Un punto de seguimiento puede actuar como una instrucción de seguimiento temporal en el lenguaje de programación y no pausa la ejecución del código. Para crear un punto de seguimiento, establezca una acción especial en la ventana Configuración del punto de interrupción. Para obtener instrucciones detalladas, vea Uso de puntos de seguimiento en el depurador de Visual Studio.

Condiciones de punto de interrupción

Puede controlar cuándo y dónde funciona un punto de interrupción configurando condiciones. La condición puede ser cualquier expresión válida que reconozca el depurador. (Para obtener más información sobre las expresiones válidas, vea expresiones en el depurador).

Para establecer una condición de punto de interrupción:

  1. Haga clic con el botón derecho en el símbolo del punto de interrupción y seleccione Condiciones (o presione Alt + F9, C). También puede mantener el ratón sobre el símbolo del punto de interrupción, seleccionar el icono Configuración y, después, seleccionar Condiciones en la ventana Configuración del punto de interrupción.

    También puede hacer clic con el botón derecho en el margen izquierdo situado junto a una línea de código y seleccionar Insertar punto de interrupción condicional en el menú contextual para establecer un nuevo punto de interrupción condicional.

    También puede establecer condiciones en la ventana Puntos de interrupción haciendo clic con el botón derecho en un punto de interrupción y seleccionando Configuración, y luego seleccionando Condiciones

    Configuración del punto de interrupción

    Configuración del punto de interrupción

  2. En la lista desplegable, seleccione Expresión Condicional, Recuento de Impactos, o Filtro, y establezca el valor en consecuencia.

  3. Seleccione Cerrar o presione Ctrl+Entrar para cerrar la ventana Configuración del punto de interrupción. (o, en la ventana Puntos de interrupción, seleccione Aceptar para cerrar el cuadro de diálogo).

Los puntos de interrupción con condiciones establecidas aparecen con un símbolo + en el código fuente y en las ventanas Puntos de interrupción.

Creación de una expresión condicional

Al seleccionar Expresión condicional, puede elegir entre dos condiciones: Es true o Cuando cambie. Elija Es true para interrumpir cuando la expresión se cumpla o Cuando cambie para interrumpir cuando el valor de la expresión cambie.

En el ejemplo siguiente, el punto de interrupción solo se alcanza cuando el valor de testInt es 4:

Condición

Condición

En el ejemplo siguiente, el punto de interrupción solo se alcanza cuando cambia el valor de testInt:

Condición Cuando cambie del punto de interrupción

Condición Cuando cambie del punto de interrupción

Si establece una condición de punto de interrupción con sintaxis no válida, aparece un mensaje de advertencia. Si especifica una condición de punto de interrupción con sintaxis válida pero semántica no válida, aparece un mensaje de advertencia la primera vez que se alcanza el punto de interrupción. En ambos casos, el depurador se detendrá cuando se alcance el punto de interrupción no válido. El punto de interrupción se omitirá únicamente si la condición es válida y se evalúa como false.

Nota

Para el campo Cuando cambie, el depurador no considerará la primera evaluación de la condición como cambio, por lo que no se visita el punto de interrupción en la primera evaluación.

Usar identificadores de objeto en expresiones condicionales (solo C# y F#)

Hay ocasiones en las que desea observar el comportamiento de un objeto específico. Por ejemplo, es posible que desee averiguar por qué se insertó un objeto en una colección más de una vez. En C# y F#, puede crear identificadores de objeto para instancias específicas de tipos de referencia y usarlos en condiciones de punto de interrupción. Los servicios de depuración de Common Language Runtime (CLR) generan el identificador de objeto y lo asocian al objeto.

Para crear un identificador de objeto:

  1. Establezca un punto de interrupción en el código en algún lugar después de crear el objeto.

  2. Inicie la depuración y, cuando la ejecución se detenga en el punto de interrupción, seleccione Depurar>Windows>Locals (o presione Ctrl + Alt + V, L) para abrir la ventana Locals.

    Busque la instancia de objeto específica en la ventana Variables locales, haga clic con el botón derecho en ella y seleccione Make Object ID.

    Debería ver el símbolo $ junto con un número en la ventana Locales. Este es el identificador de objeto.

  3. Agregue un nuevo punto de interrupción en el punto que desee investigar; por ejemplo, cuando el objeto se va a agregar a la colección. Haga clic con el botón derecho en el punto de interrupción y seleccione Condiciones.

  4. Use el identificador de objeto en el campo Expresión condicional. Por ejemplo, si la variable item es el objeto que se va a agregar a la colección, seleccione Es true y escriba item == $<n>, donde <n> es el número de identificador de objeto.

    La ejecución se interrumpirá cuando ese objeto vaya a agregarse a la colección.

    Para eliminar el id. de objeto, haga clic con el botón derecho en la variable en la ventana Variables locales y seleccione Eliminar id. de objeto.

Nota

Los identificadores de objeto crean referencias débiles y no impiden que el objeto se recopile en la recolección de elementos no utilizados. Los identificadores de objeto solo son válidos para la sesión de depuración actual.

Establecimiento de una condición de recuento de aciertos

Si sospecha que un bucle del código comienza a comportarse incorrectamente después de un número determinado de iteraciones, puede establecer un punto de interrupción para detener la ejecución después de ese número de visitas, en lugar de tener que presionar repetidamente F5 para alcanzar esa iteración.

En la sección Condiciones de la ventana Configuración del punto de interrupción, seleccione Número de llamadas y, después, especifique el número de iteraciones. En el siguiente ejemplo, el punto de interrupción está configurado para alcanzarse cada dos iteraciones:

Número de puntos de interrupción alcanzados

Número de puntos de interrupción alcanzados

Establecimiento de una condición de filtro

Puede restringir un punto de interrupción para que se active solo en dispositivos especificados o en procesos y subprocesos especificados.

En la sección Condiciones de la ventana Configuración del punto de interrupción, seleccione Filtro y, después, escriba una o varias de las siguientes expresiones:

  • MachineName = "name"
  • IdProceso = valor
  • NombreDelProceso = "name"
  • ThreadId = value
  • ThreadName = "name"

Incluya valores de cadena entre comillas dobles. Puede combinar cláusulas mediante & (AND), || (OR), ! (NOT) y paréntesis.

Establecimiento de puntos de interrupción de función

Puede interrumpir la ejecución cuando se llama a una función. Esto es útil, por ejemplo, cuando conoce el nombre de la función, pero no su ubicación. También resulta útil si tiene funciones con el mismo nombre y desea interrumpirlas todas (como funciones sobrecargadas o funciones en proyectos diferentes).

Para establecer un punto de interrupción de función:

  1. Seleccione Depurar>Nuevo punto de interrupción>Punto de interrupción de función o presione CTRL + K, B.

    También puede seleccionar Nuevo>Punto de interrupción de función en la ventana Puntos de interrupción.

  2. En el cuadro de diálogo Nuevo punto de interrupción de función, escriba el nombre de la función en el cuadro Nombre de función.

    Para restringir la especificación de la función:

    • Use el nombre completo de la función.

      Ejemplo: Namespace1.ClassX.MethodA()

    • Agregue los tipos de parámetro de una función sobrecargada.

      Ejemplo: MethodA(int, string)

    • Use el símbolo '!' para especificar el módulo.

      Ejemplo: App1.dll!MethodA

    • Use el operador de contexto en C++nativo.

      {function, , [module]} [+<line offset from start of method>]

      Ejemplo: {MethodA, , App1.dll}+2

  3. En la lista desplegable Idioma, elija el idioma de la función.

  4. Seleccione Aceptar.

Establecer un punto de interrupción de función mediante una dirección de memoria (solo C++ nativo)

Puede usar la dirección de un objeto para establecer un punto de interrupción de función en un método llamado por una instancia específica de una clase. Por ejemplo, dado un objeto direccionable de tipo my_class, puede establecer un punto de interrupción de función en el método my_method que la instancia llama.

  1. Establezca un punto de interrupción en algún lugar después de crear una instancia de la clase.

  2. Busque la dirección de la instancia (por ejemplo, 0xcccccccc).

  3. Seleccione Depurar>Nuevo punto de interrupción>Punto de interrupción de función o presione CTRL + K, B.

  4. Agregue lo siguiente al cuadro Nombre de función, y seleccione el lenguaje C++.

    ((my_class *) 0xcccccccc)->my_method
    

Establecimiento de puntos de interrupción de datos (.NET Core 3.x o .NET 5+)

Los puntos de interrupción de datos interrumpen la ejecución cuando cambia la propiedad de un objeto específico.

Para establecer un punto de interrupción de datos:

  1. En un proyecto de .NET Core o .NET 5+, inicie la depuración y espere hasta que se alcance un punto de interrupción.

  2. En las ventanas Automático, Inspección o Variables locales, haga clic con el botón derecho en una propiedad y seleccione Interrumpir cuando cambia el valor en el menú contextual.

    Punto de interrupción de datos administrado

Los puntos de interrupción de datos para .NET Core y .NET 5+ no funcionarán para:

  • Propiedades que no se pueden expandir en las ventanas Variables locales, Automático, Inspección o de información sobre herramientas
  • Variables estáticas
  • Clases con el atributo DebuggerTypeProxy
  • Campos dentro de estructuras

Para obtener el número máximo que puede establecer, consulte Límites de hardware de puntos de interrupción de datos.

Establecer puntos de interrupción de datos (solo C++ nativo)

Los puntos de interrupción de datos interrumpen la ejecución cuando cambia un valor almacenado en una dirección de memoria especificada. Si el valor se lee pero no cambia, la ejecución no se interrumpe.

Para establecer un punto de interrupción de datos:

  1. En un proyecto de C++, inicie la depuración y espere hasta que se alcance un punto de interrupción. En el menú Depurar, elija Nuevo punto de interrupción>Punto de interrupción de datos.

    También puede seleccionar Nuevo>Punto de interrupción de datos en la ventana Puntos de interrupción o hacer clic con el botón derecho en un elemento de las ventanas Automático, Inspección o Variables locales y seleccionar Interrumpir cuando cambia el valor en el menú contextual.

  2. En el cuadro Dirección, escriba una dirección de la memoria o una expresión que se evalúe como una dirección de memoria. Por ejemplo, escriba &avar para interrumpir cuando cambie el contenido de la variable avar.

  3. En el desplegable Recuento de bytes , seleccione el número de bytes que desea que el depurador inspeccione. Por ejemplo, si selecciona 4, el depurador observará los cuatro bytes a partir de &avar e interrumpirá si alguno de esos bytes cambia el valor.

Los puntos de interrupción de datos no funcionan en las condiciones siguientes:

  • Si un proceso que no se está depurando escribe en la ubicación de la memoria.
  • La ubicación de memoria se comparte entre dos o más procesos.
  • La ubicación de memoria se actualiza dentro del kernel. Por ejemplo, si se pasa memoria a la función ReadFile de Windows de 32 bits, la memoria se actualizará desde el modo kernel, con lo cual el depurador no se detendrá en la actualización.
  • Cuando la expresión de inspección sea superior a 4 bytes en un hardware de 32 bits y a 8 bytes en un hardware de 64 bits. Se trata de una limitación de la arquitectura x86.

Nota

  • Los puntos de interrupción de datos dependen de direcciones de memoria específicas. La dirección de una variable cambia de una sesión de depuración a la siguiente, por lo que los puntos de interrupción de datos se deshabilitan automáticamente al final de cada sesión de depuración.

  • Si establece un punto de interrupción de datos en una variable local, el punto de interrupción permanece habilitado cuando finaliza la función, pero la dirección de memoria ya no es aplicable, por lo que el comportamiento del punto de interrupción es impredecible. Si establece un punto de interrupción de datos en una variable local, debe eliminar o deshabilitar el punto de interrupción antes de que finalice la función.

Límites de hardware de puntos de interrupción de datos

El kernel de Windows y el hardware subyacente tienen los límites siguientes al establecer puntos de interrupción de datos. El límite hace referencia al número máximo de puntos de interrupción de datos que puede establecer.

Arquitectura del procesador Límite de puntos de interrupción de datos
x64 y x86 4
ARM64 2
ARM 1

Establecer un punto de interrupción dependiente

Los puntos de interrupción dependientes solo interrumpen la ejecución si se alcanza otro punto de interrupción primero. Por lo tanto, en un escenario complejo, como la depuración de una aplicación multiproceso, puede configurar los puntos de interrupción adicionales después de que se alcance primero otro punto de interrupción. Esto puede facilitar mucho la depuración de código en caminos comunes, como el bucle de juego o una API de utilidad, porque se puede configurar un punto de interrupción en esas funciones para que se habilite solo si la función es invocada desde una parte específica de tu aplicación.

Establecer un punto de interrupción dependiente:

  1. Mantenga el puntero sobre el símbolo del punto de interrupción, elija el icono Configuración y, a continuación, seleccione Only enable when the following breakpoint is hit (Habilitar solo cuando se alcance el siguiente punto de interrupción) en la ventana de configuración de punto de interrupción.

  2. En la lista desplegable, seleccione el punto de interrupción prerequisito del que desea que dependa el punto de interrupción actual.

Elija Cerrar o presione Ctrl+Entrar para cerrar la ventana Configuración del punto de interrupción. O bien, en la ventana Puntos de interrupción, elija OK para cerrar el diálogo. Punto de interrupción dependiente

También puede usar el menú contextual del botón derecho para establecer el punto de interrupción dependiente.

  1. Haga clic con el botón derecho en el margen izquierdo situado junto a una línea de código y seleccione Insert Dependent Breakpoint (Insertar punto de interrupción dependiente) en el menú contextual.

    Contexto de punto de interrupción dependiente DependentBreakpointContext

  • Los puntos de interrupción dependientes no funcionan si solo hay un único punto de interrupción en la aplicación.
  • Los puntos de interrupción dependientes se convierten en puntos de interrupción de línea estándar si se elimina el punto de interrupción previo.

Establecer un punto de interrupción temporal

Este punto de interrupción le permite interrumpir el código solo una vez. Al depurar, el depurador de Visual Studio solo detiene la aplicación en ejecución una vez para este punto de interrupción y lo elimina inmediatamente después de que se haya alcanzado.

Para establecer un punto de interrupción temporal:

  1. Mantenga el puntero sobre el símbolo del punto de interrupción, elija el icono Configuración y, a continuación, seleccione Remove breakpoint once hit (Eliminar punto de interrupción una vez alcanzado) en la ventana de configuración de punto de interrupción.

  2. Elija Cerrar o presione Ctrl+Entrar para cerrar la ventana Configuración del punto de interrupción. O, en la ventana Puntos de interrupción, seleccione Aceptar para cerrar el cuadro de diálogo.

    Punto de interrupción temporal

También puede usar el menú contextual del botón derecho para establecer el punto de interrupción temporal.

  1. Haga clic con el botón derecho en el margen izquierdo situado junto a una línea de código y seleccione Insert Temporary Breakpoint (Insertar punto de interrupción temporal) en el menú contextual.

    Punto de interrupción temporal TemporaryBreakpointContext

O simplemente use el acceso directo F9 + Mayús + Alt, T y establezca el punto de interrupción temporal en la línea deseada.