Share via


Points d’arrêt conditionnels dans WinDbg et d’autres débogueurs Windows

Les points d’arrêt conditionnels dans WinDbg et d’autres débogueurs Windows sont utiles lorsque vous devez vous arrêter uniquement si une condition spécifique est remplie.

Un point d’arrêt conditionnel est créé avec le paramètre « /w » pour le bp (Définir le 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 ne provoque une interruption dans le débogueur que lorsque la condition spécifiée est vraie. « w » est une abréviation de « when ». L’expression de condition peut être tout ce qui peut être utilisé avec la commande dx (Display Debugger Object Model Expression). Cela inclut la plupart des expressions de style C++, notamment les comparaisons, l’arithmétique, les opérations de pointeur, etc. Par instance, un point d’arrêt conditionnel de base qui s’interrompt uniquement lorsqu’une variable est supérieure à 20 peut être écrit comme suit :

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

Étant donné que la condition est évaluée à l’aide du modèle objet du débogueur, vous pouvez également tirer parti de choses telles que la prise en charge de NatVis. Par instance, 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`

Cette opération s’interrompt lorsque la ligne 143 de mysource.cpp est exécutée alors que la variable myVec comporte 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 plus d’informations 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, il est également possible d’évaluer les registres à l’aide de ces expresions. Par instance, 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 du point d’arrêt conditionnel hérité

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 consistait à utiliser la commande j (Execute If - Else) ou le jeton .if, suivi de la commande gc (Go from Conditional Breakpoint). Bien que ces méthodes de définition de points d’arrêt conditionnels ne soient plus recommandées, elles fonctionnent toujours et vous pouvez voir 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 utilisant le jeton .if est la suivante :

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