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 se necesita 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 bp (Establecer punto de interrupción) u otro comando de punto de interrupción. La sintaxis básica del comando es:

0:000> bp /w "(Condition)" Address

El punto de interrupción solo provocará una interrupción en el depurador cuando se cumpla la condición especificada. "w" es una abreviatura de "when". La expresión de condición puede ser cualquier cosa que se pueda usar con el comando dx (Display Debugger Object Model Expression). 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 las cosas como la compatibilidad con NatVis. Por ejemplo, suponiendo que myVec es un std::vector<int>objeto , podría crear una condición como:

0:000> bp /w "myVec.Count() == 4" `mysource.cpp:143`

Esto se interrumpirá cuando se ejecute la línea 143 de mysource.cpp mientras la variable myVec tiene 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 (Load 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 Scripting del depurador de JavaScript.

Aunque las expresiones de nivel superior 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 (Execute If - Else) o el token .if, seguido del comando gc (Ir desde punto de interrupción condicional). Aunque ya no se recomiendan estos métodos para establecer puntos de interrupción condicionales, 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}"