Puis-je spécifier que je veux que gdb casse à la ligne x lorsque char* x
pointe vers une chaîne dont la valeur est égale à "hello"
? Si oui, comment?Comment définir un point d'arrêt conditionnel dans gdb, lorsque char * x pointe sur une chaîne dont la valeur est égale à "bonjour"?
Répondre
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 une variable.
Remarque: vous devez déjà exécuter le programme pour que GDB puisse voir le fichier stdlib. Sinon: 'Pas de symbole" strcmp "dans le contexte actuel.' –
@ naive231 par "voir" Je voulais dire voir les fonctions pour pouvoir les casser, pas la source: vous devez appuyer sur 'run' pour que les bibliothèques dynamiques soient chargées. Pour source, google et trouver: http://stackoverflow.com/questions/10000335/how-to-use-debug-version-of-libc :-) –
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 auriez à lancer, sinon cela reviendrait toujours à vrai!
Since GDB 7.5 vous pouvez utiliser ces Convenience Functions à portée de main:
$_memeq(buf1, buf2, length)`
$_streq(str1, str2)
$_strlen(str)
$_regex(str, regex)
semble tout à fait moins problématique que d'avoir à exécuter un « étranger » strcmp()
sur le processus pile chaque fois que le point d'arrêt est touché.
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 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 qu'il
condition <breakpoint number> $_streq(x, "hello")
$_streq
correspond uniquement à l'ensemble str ing, donc si vous voulez quelque chose de plus rusé, vous devez utiliser $_regex
, qui prend en charge le Python regular expression syntax.
Remarque: 'strncmp' et' strstr' sont d'autres fonctions de requête C utiles. –