Wie setze ich einen bedingten Haltepunkt in gdb, wenn char * x auf eine Zeichenfolge zeigt, deren Wert gleich "Hallo" ist?

164

Kann ich angeben, dass gdb in Zeile x unterbrochen werden soll, wenn char* xauf eine Zeichenfolge gezeigt wird, deren Wert gleich ist "hello"? Wenn ja, wie?

341008
quelle
Hinweis: strncmpund strstrsind weitere nützliche C-Abfragefunktionen.
Ciro Santilli 法轮功 冠状 病 六四 事件 27

Antworten:

198

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.

Nathan Fellman
quelle
9
Hinweis: Sie müssen das Programm bereits ausführen, damit GDB die stdlib sehen kann. Ansonsten:No symbol "strcmp" in current context.
Ciro Santilli 法轮功 冠状 病 六四 事件 27
1
@CiroSantilli How 事件 法轮功 包 包 轩: Wie konfiguriere ich gdb, um die stdlib zu sehen?
naive231
@ naive231 mit "see" Ich meinte "see" -Funktionen, damit Sie sie brechen können, nicht die Quelle: Sie müssen darauf klicken run, damit dynamische Bibliotheken geladen werden. Für die Quelle googeln Sie es und finden Sie: stackoverflow.com/questions/10000335/… :-)
Ciro Santilli 13 冠状 病 六四 六四 法轮功
1
Diese Methode kann Nebenwirkungen haben. $_streqMethode von @tlwhitec ist besser.
Rools
55
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!

Tobias Domhan
quelle
46

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 .

tlwhitec
quelle