Comment puis-je mettre un point d'arrêt conditionnel dans gdb, lorsque char * x pointe sur une chaîne dont la valeur est égale à « bonjour »?
-
10-10-2019 - |
Question
Puis-je préciser que je veux gdb briser à la ligne x lorsque les points de char* x
à une chaîne dont la valeur est égale "hello"
? Si oui, comment?
La solution
Vous pouvez utiliser strcmp
:
break x:20 if strcmp(y, "hello") == 0
20
est le numéro de ligne, x
peut être un nom de fichier et y
peut être toute variable.
Autres conseils
break x if ((int)strcmp(y, "hello")) == 0
Sur certaines implémentations gdb pourraient ne pas connaître le type de retour de strcmp. Cela signifie que vous auriez à plâtre, sinon il évalueraient toujours vrai!
Depuis GDB 7.5 vous pouvez les utiliser à portée de main Fonctions de confort de:
$_memeq(buf1, buf2, length)`
$_streq(str1, str2)
$_strlen(str)
$_regex(str, regex)
Il semble tout à fait moins problématique que d'avoir à exécuter une strcmp()
« étrangère » sur le processus pile chaque fois que le point d'arrêt est atteint.
Notez vos besoins GDB à être compilé avec le support de Python, ce qui est un problème avec Linux en cours distros. Pour être sûr, vous pouvez le vérifier en exécutant
show configuration
gdb et la recherche de--with-python
. Ce petit oneliner fait le tour aussi:$ gdb -n -quiet -batch -ex 'show configuration' | grep 'with-python' --with-python=/usr (relocatable)
Pour votre cas de démonstration, l'utilisation serait
break <where> if $_streq(x, "hello")
ou, si votre point d'arrêt existe déjà et que vous voulez juste ajouter la condition à elle
condition <breakpoint number> $_streq(x, "hello")
$_streq
correspond uniquement à la chaîne entière, donc si vous voulez quelque chose de plus, vous devez utiliser la ruse $_regex
, qui prend en charge la balise syntaxe Python expression régulière .