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}"
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de