Points d’arrêt conditionnels dans WinDbg et d’autres débogueurs Windows
Les points d’arrêt conditionnels de WinDbg et d’autres débogueurs Windows sont utiles lorsque vous devez interrompre le processus uniquement si une condition spécifique est remplie.
Un point d’arrêt conditionnel est créé avec le paramètre « /w » sur la commande bp (Définir un point d’arrêt) ou une autre commande de point d’arrêt. La syntaxe de base de la commande est la suivante :
0:000> bp /w "(Condition)" Address
Le point d’arrêt provoque un arrêt dans le débogueur uniquement lorsque la condition spécifiée est vraie. Le « w » est une abréviation de « when » (quand). L’expression de condition peut être tout ce qui peut être utilisé avec la commande dx (Afficher l’expression du modèle d’objet de débogage). Cela inclut la plupart des expressions de style C++, notamment des comparaisons, l’arithmétique, des opérations de pointeur et d’autres. Par exemple, un point d’arrêt conditionnel de base qui intervient uniquement lorsqu’une variable est supérieure à 20 peut être écrite comme suit :
0:000> bp /w "MyVar > 20" `mysource.cpp:143`
Étant donné que la condition est évaluée à l’aide du modèle d’objet du débogueur, vous pouvez également tirer parti de choses comme la prise en charge natVis. Par exemple, en supposant que myVec est un std::vector<int>
, vous pouvez créer une condition telle que :
0:000> bp /w "myVec.Count() == 4" `mysource.cpp:143`
Cela interviendra lorsque la ligne 143 de mysource.cpp sera exécutée alors que la variable myVec a 4 éléments.
Au-delà de natvis, vous pouvez également appeler une fonction JavaScript. Si vous chargez un script à l’aide de la fenêtre de script WinDbg ou de la commande .scriptload (Charger le script) qui contient une fonction appelée « myFunc », vous pouvez définir un point d’arrêt comme suit :
0:000> bp /w "@$scriptContents.myFunc()" `mysource.cpp:143`
Pour en savoir plus sur l’écriture de fonctions et d’extensions JavaScript dans le débogueur, consultez Script du débogueur JavaScript
Bien que les expressions de niveau supérieur soient généralement les plus utiles, on peut également évaluer les registres à l’aide de ces expressions. Par exemple, vous pouvez créer un point d’arrêt qui se déclenche uniquement lorsque le pointeur de pile atteint un seuil :
0:000> bp /w "@esp < 0x6ff9f8" `mysource.cpp:143`
Syntaxe de point d’arrêt conditionnel héritée
Avant la disponibilité du paramètre « /w » pour les commandes de point d’arrêt, la méthode recommandée pour définir des points d’arrêt conditionnels était d’utiliser la commande j (Execute If - Else) ou le jeton .if, suivi de la commande gc (Aller à partir d’un point d’arrêt conditionnel). Bien que ces méthodes de définition de points d’arrêt conditionnels ne soient plus recommandées, elles fonctionnent toujours et on peut trouver cette syntaxe référencée dans d’autres sources.
La syntaxe de base d’un point d’arrêt conditionnel à l’aide de la commande j est la suivante :
0:000> bp Address "j (Condition) 'OptionalCommands'; 'gc' "
La syntaxe de base d’un point d’arrêt conditionnel à l’aide du jeton .if est la suivante :
0:000> bp Address ".if (Condition) {OptionalCommands} .else {gc}"