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


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.


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!


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 .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.