Antworten:
Sie können verwenden strcmp:
break x:20 if strcmp(y, "hello") == 0
20ist die Zeilennummer, xkann ein beliebiger Dateiname und yeine 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/… :-)
$_streqMethode 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 configurationin 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")
$_streqEntspricht 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 .
strncmpundstrstrsind weitere nützliche C-Abfragefunktionen.