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

164

Puis-je spécifier que je veux que gdb coupe à la ligne x lorsque char* xpointe vers une chaîne dont la valeur est égale "hello"? Si oui, comment?

341008
la source
Remarque: strncmpet strstrsont d'autres fonctions de requête C utiles.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Réponses:

198

Vous pouvez utiliser strcmp:

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

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

Nathan Fellman
la source
9
Remarque: vous devez déjà exécuter le programme pour que GDB voie le fichier stdlib. Sinon:No symbol "strcmp" in current context.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
@CiroSantilli 六四 事件 法轮功 包 卓 轩: Comment configurer gdb pour voir le stdlib?
naïf231
@ naive231 par "voir" Je voulais dire voir les fonctions pour que vous puissiez y accéder, pas la source: vous devez frapper runpour cela pour que les bibliothèques dynamiques soient chargées. Pour la source, recherchez-la sur Google et trouvez: stackoverflow.com/questions/10000335/… :-)
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
Cette méthode peut avoir des effets secondaires. $_streqLa méthode de @tlwhitec est meilleure.
rools
55
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 devrez lancer un casting, sinon il serait toujours évalué à vrai!

Tobias Domhan
la source
46

Depuis GDB 7.5, vous pouvez utiliser ces fonctions pratiques natives :

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

Cela semble bien moins problématique que d'avoir à exécuter un "étranger" strcmp()sur la pile du processus à chaque fois que le point d'arrêt est atteint. Cela est particulièrement vrai pour le débogage des processus multithreads.

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 configurationdans 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")

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

tlwhitec
la source