Antworten:
Sie können verwenden strcmp
:
break x:20 if strcmp(y, "hello") == 0
20
ist die Zeilennummer, x
kann ein beliebiger Dateiname und y
eine beliebige Variable sein.
No symbol "strcmp" in current context.
run
, damit dynamische Bibliotheken geladen werden. Für die Quelle googeln Sie es und finden Sie: stackoverflow.com/questions/10000335/… :-)
$_streq
Methode von @tlwhitec ist besser.
break x if ((int)strcmp(y, "hello")) == 0
Bei einigen Implementierungen kennt gdb den Rückgabetyp von strcmp möglicherweise nicht. Das heißt, Sie müssten gießen, sonst würde es immer als wahr bewertet!
Seit GDB 7.5 können Sie diese nativen Komfortfunktionen verwenden :
$_memeq(buf1, buf2, length)
$_regex(str, regex)
$_streq(str1, str2)
$_strlen(str)
Scheint weniger problematisch zu sein, als strcmp()
jedes Mal, wenn der Haltepunkt erreicht wird , ein "Fremd" auf dem Prozessstapel ausführen zu müssen . Dies gilt insbesondere für das Debuggen von Multithread-Prozessen.
Beachten Sie, dass Ihre GDB mit Python-Unterstützung kompiliert werden muss, was bei aktuellen Linux-Distributionen kein Problem darstellt. Um sicherzugehen, können Sie dies überprüfen, indem Sie
show configuration
in GDB laufen und nach suchen--with-python
. Dieser kleine Oneliner macht auch den Trick:$ gdb -n -quiet -batch -ex 'show configuration' | grep 'with-python' --with-python=/usr (relocatable)
Für Ihren Demo-Fall wäre die Verwendung
break <where> if $_streq(x, "hello")
oder wenn Ihr Haltepunkt bereits vorhanden ist und Sie nur die Bedingung hinzufügen möchten
condition <breakpoint number> $_streq(x, "hello")
$_streq
Entspricht nur der gesamten Zeichenfolge. Wenn Sie also etwas schlaueres möchten, sollten Sie es verwenden $_regex
, das die Python-Syntax für reguläre Ausdrücke unterstützt .
strncmp
undstrstr
sind weitere nützliche C-Abfragefunktionen.