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 interromper somente se uma condição específica é atendida.

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

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

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

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

Como a condição é avaliada usando o modelo de objeto do depurador, você também pode tirar proveito do suporte do NatVis. Por exemplo, supondo que myVec seja um std::vector<int>, você poderá 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 do WinDbg ou o comando .scriptload (Carregar Script) que contém uma função chamada "myFunc", poderá pode 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, confira Script do Depurador JavaScript.

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

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

Sintaxe de ponto de interrupção condicional herdada

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 (Executar If - Else) ou o token .if, seguido pelo comando gc (Ir do Ponto de Interrupção Condicional). Embora esses métodos de definição de pontos de interrupção condicionais não sejam mais recomendados, eles ainda funcionam e você pode ver essa sintaxe mencionada 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}"