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}"