Puntos de interrupción condicionales en WinDbg y otros depuradores de Windows
Los puntos de interrupción condicionales en WinDbg y otros depuradores de Windows son útiles cuando es necesario interrumpir solo si se cumple una condición específica.
Se crea un punto de interrupción condicional con el parámetro "/w" en el comando bp (Establecer punto de interrupción) u otro comando de punto de interrupción. La sintaxis básica del comando es la siguiente:
0:000> bp /w "(Condition)" Address
El punto de interrupción solo provocará una irrupción en el depurador cuando la condición especificada sea true. "w" es una abreviatura de "when". La expresión de condición puede ser cualquier cosa que se pueda usar con el comando dx (Mostrar la expresión del modelo de objeto del depurador). Esto incluye la mayoría de las expresiones de estilo de C++, incluidas comparaciones, aritméticas, operaciones de puntero y otras. Por ejemplo, un punto de interrupción condicional básico que solo se interrumpe cuando una variable es superior a 20 podría escribirse como:
0:000> bp /w "MyVar > 20" `mysource.cpp:143`
Dado que la condición se evalúa mediante el modelo de objetos del depurador, también puede aprovechar las ventajas de aspectos como la compatibilidad con NatVis. Por ejemplo, suponiendo que myVec es un std::vector<int>
, podría crear una condición como:
0:000> bp /w "myVec.Count() == 4" `mysource.cpp:143`
Esto irrumpirá cuando se ejecute la línea 143 de mysource.cpp mientras la variable myVec tenga 4 elementos.
Además de natvis, también puede invocar una función de JavaScript. Si carga un script mediante la ventana de script de WinDbg o el comando .scriptload (Cargar script) que contiene una función denominada "myFunc", podría establecer un punto de interrupción similar al siguiente:
0:000> bp /w "@$scriptContents.myFunc()" `mysource.cpp:143`
Para obtener más información sobre cómo escribir funciones y extensiones de JavaScript en el depurador, consulte Creación de scripts del depurador de JavaScript.
Aunque las expresiones generales suelen ser las más útiles, también es posible evaluar los registros mediante estas expresiones. Por ejemplo, podría crear un punto de interrupción que solo se desencadene cuando el puntero de pila alcance algún umbral:
0:000> bp /w "@esp < 0x6ff9f8" `mysource.cpp:143`
Sintaxis de punto de interrupción condicional heredada
Antes de la disponibilidad del parámetro "/w" en los comandos de punto de interrupción, la manera recomendada de establecer puntos de interrupción condicionales era usar el comando j (Ejecutar If - Else) o el token .if, seguido del comando gc (Ir desde el punto de interrupción condicional). Aunque estos métodos de configuración de puntos de interrupción condicionales ya no se recomiendan, siguen funcionando y es posible que vea esta sintaxis a la que se hace referencia en otros orígenes.
La sintaxis básica de un punto de interrupción condicional mediante el comando j es la siguiente:
0:000> bp Address "j (Condition) 'OptionalCommands'; 'gc' "
La sintaxis básica de un punto de interrupción condicional mediante el token .if es la siguiente:
0:000> bp Address ".if (Condition) {OptionalCommands} .else {gc}"