Pontos de interrupção condicionais no WinDbg e em outros depuradores do Windows

Pontos de interrupção condicionais no WinDbg e em outros depuradores do Windows são úteis quando você precisa entrar somente se uma condição específica for atendida.

Um ponto de interrupção condicional é criado com o parâmetro "/w" para o comando bp (Set Breakpoint) ou outro ponto de interrupção. A sintaxe básica do comando é:

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

O ponto de interrupção só causará uma quebra no depurador quando a condição especificada for verdadeira. O "w" é uma abreviação para "quando". A expressão de condição pode ser qualquer coisa que possa ser usada com o comando dx (Expressão de Modelo de Objeto do Depurador de Exibição). Isso inclui a maioria das expressões de estilo C++, incluindo comparações, aritméticas, operações de ponteiro e outras. Por exemplo, um ponto de interrupção condicional básico que só é interrompido quando uma variável tem mais de 20 pode ser gravado como:

0:000> bp /w "MyVar > 20" `mysource.cpp:143`

Como a condição é avaliada usando o modelo de objeto de depurador, você também pode aproveitar itens como o suporte do NatVis. Por exemplo, supondo que myVec seja um std::vector<int>, você pode criar uma condição como:

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

Isso será interrompido quando a linha 143 de mysource.cpp for executada enquanto a variável myVec tiver 4 elementos.

Além do natvis, você também pode invocar uma função JavaScript. Se você carregar um script usando a janela de script WinDbg ou o comando .scriptload (Script de Carga) que contém uma função chamada "myFunc", você poderá definir um ponto de interrupção como este:

0:000> bp /w "@$scriptContents.myFunc()" `mysource.cpp:143`

Para obter mais informações sobre como escrever funções e extensões JavaScript no depurador, consulte Scripts do Depurador javaScript

Embora expressões de nível mais alto normalmente sejam as mais úteis, também é possível avaliar registros usando essas expresões. Por exemplo, você pode criar um ponto de interrupção que só é disparado quando o ponteiro de pilha atinge algum limite:

0:000> bp /w "@esp < 0x6ff9f8" `mysource.cpp:143`

Sintaxe do ponto de interrupção condicional herdado

Antes da disponibilidade do parâmetro "/w" para os comandos de ponto de interrupção, a maneira recomendada de definir pontos de interrupção condicionais era usar o comando j (Execute If - Else) ou o token .if, seguido pelo comando gc (Go from Conditional Breakpoint). Embora esses métodos de configuração de pontos de interrupção condicionais não sejam mais recomendados, eles ainda funcionam e você pode ver essa sintaxe referenciada em outras fontes.

A sintaxe básica para um ponto de interrupção condicional usando o comando j é a seguinte:

0:000> bp Address "j (Condition) 'OptionalCommands'; 'gc' "

A sintaxe básica para um ponto de interrupção condicional usando o token .if é a seguinte:

0:000> bp Address ".if (Condition) {OptionalCommands} .else {gc}"