Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Cette rubrique contient des exemples d’expressions MASM et C++ utilisées dans différentes commandes.
Toutes les autres sections de cette documentation d’aide utilisent la syntaxe d’expression MASM dans les exemples (sauf indication contraire). La syntaxe d’expression C++ est très utile pour manipuler des structures et des variables, mais elle n’analyse pas très bien les paramètres des commandes du débogueur.
Si vous utilisez des commandes de débogueur à des fins générales ou à l’aide d’extensions de débogueur, vous devez définir la syntaxe d’expression MASM comme syntaxe par défaut, par exemple en utilisant .expr (Choisir l’évaluateur d’expression). Si vous devez disposer d’un paramètre spécifique pour utiliser la syntaxe d’expression C++, utilisez la syntaxe @@( ).
Si myInt est une valeur ULONG32 et si vous utilisez l’évaluateur d’expression MASM, les deux exemples suivants montrent la valeur de MyInt.
0:000> ?? myInt
0:000> dd myInt L1
Toutefois, l’exemple suivant montre l’adresse de myInt.
0:000> ? myInt
Points d’arrêt conditionnels
Vous pouvez utiliser des opérateurs de comparaison pour créer des points d’arrêt conditionnels. L’exemple de code suivant utilise la syntaxe d’expression MASM. Étant donné que le rayon par défaut actuel est 16, l’exemple utilise le préfixe 0n afin que le nombre 20 soit compris comme un nombre décimal.
0:000> bp MyFunction+0x43 "j ( poi(MyVar)>0n20 ) ''; 'gc' "
Dans l’exemple précédent, MyVar est un entier dans la source C. Étant donné que l’analyseur MASM traite tous les symboles comme des adresses, l’exemple doit avoir l’opérateur poi pour déréférer MyVar.
Expressions conditionnelles
L’exemple suivant imprime la valeur d’ecx si eax est supérieur à ebx, 7 si eax est inférieur à ebx et 3 si eax est égal à ebx. Cet exemple utilise l’évaluateur d’expression MASM, de sorte que le signe égal (=) est un opérateur de comparaison, et non un opérateur d’affectation.
0:000> ? ecx*(eax>ebx) + 7*(eax<ebx) + 3*(eax=ebx)
Dans la syntaxe C++, le @ signe indique un registre, un signe double égal (==) est l’opérateur de comparaison, et le code doit explicitement effectuer un cast de BOOL en int. Par conséquent, dans la syntaxe C++, la commande précédente devient la suivante.
0:000> ?? @ecx*(int)(@eax>@ebx) + 7*(int)(@eax<@ebx) + 3*(int)(@eax==@ebx)
Exemples d’expressions mixtes MASM et C++
Vous ne pouvez pas utiliser d’expressions de ligne source dans une expression C++. L’exemple suivant utilise la syntaxe de l’évaluateur de remplacement @@( ) pour imbriquer une expression MASM dans une expression C++. Cet exemple attribue à MyPtr l’adresse de la ligne 43 du fichier Myfile.c.
0:000> ?? MyPtr = @@( `myfile.c:43` )
Les exemples suivants définissent l’évaluateur d’expression par défaut sur MASM, puis évaluent Expression2 en tant qu’expression C++, puis évaluent Expression1 et Expression3 comme expressions MASM.
0:000> .expr /s masm
0:000> bp Expression1 + @@( Expression2 ) + Expression3
Si myInt est une valeur ULONG64 et si vous savez que cette valeur est suivie en mémoire par une autre ULONG64, vous pouvez définir un point d’arrêt d’accès à cet emplacement à l’aide de l’un des exemples suivants. (Notez l’utilisation de l’arithmétique du pointeur.)
0:000> ba r8 @@( &myInt + 1 )
0:000> ba r8 myInt + 8