web-dev-qa-db-fra.com

Comment définir un point d'arrêt conditionnel dans gdb, lorsque char * x pointe vers une chaîne dont la valeur est égale à "hello"?

Puis-je spécifier que je veux que gdb soit interrompu à la ligne x lorsque char* x pointe sur une chaîne dont la valeur est égale à "hello"? Si oui comment?

156
341008

Vous pouvez utiliser strcmp:

break x:20 if strcmp(y, "hello") == 0

20 est le numéro de ligne, x peut être n'importe quel nom de fichier et y peut être n'importe quelle variable.

192
Nathan Fellman
break x if ((int)strcmp(y, "hello")) == 0

Sur certaines implémentations, gdb peut ne pas connaître le type de retour de strcmp. Cela signifie que vous devriez lancer, sinon cela serait toujours considéré comme vrai!

52
Tobias Domhan

Depuis GDB 7.5 vous pouvez utiliser ces pratiques Fonctions de commodité :

$_memeq(buf1, buf2, length)`
$_streq(str1, str2)
$_strlen(str)
$_regex(str, regex)

Cela semble être moins problématique que de devoir exécuter une "étrangère" strcmp() sur la pile de processus à chaque fois que le point d'arrêt est atteint.

Notez que votre GDB doit être compilé avec le support Python, ce qui n’est pas un problème avec les distributions Linux actuelles. Pour être sûr, vous pouvez le vérifier en exécutant show configuration dans GDB et en recherchant --with-python. Ce petit oneliner fait aussi l'affaire:

$ 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 souhaitez simplement y ajouter la condition

condition <breakpoint number> $_streq(x, "hello")

$_streq ne correspond qu'à la chaîne entière. Si vous voulez quelque chose de plus rusé, vous devez utiliser $_regex, qui prend en charge la syntaxe syntaxe d'expression régulière Python .

33
tlwhitec