Wie richte ich einen bedingten Haltepunkt in GDB, wenn char * x verweist auf eine Zeichenfolge, deren Wert gleich „Hallo“?
-
10-10-2019 - |
Frage
Kann ich angeben, dass ich GDB in Zeile x brechen wollen, wenn char* x
verweist auf eine Zeichenfolge, deren Wert gleich "hello"
? Wenn ja, wie?
Lösung
Sie können strcmp
verwenden:
break x:20 if strcmp(y, "hello") == 0
20
ist die Zeilennummer, x
jeder Dateiname sein kann und y
kann eine beliebige Variable sein.
Andere Tipps
break x if ((int)strcmp(y, "hello")) == 0
Bei einigen Implementierungen GDB nicht den Rückgabetyp von strcmp wissen könnte. Das heißt, Sie zu Guss hätten, sonst wäre es zu bewerten immer wahr!
Da GDB 7.5 den praktischen Komfortfunktionen :
$_memeq(buf1, buf2, length)`
$_streq(str1, str2)
$_strlen(str)
$_regex(str, regex)
Es scheint ganz unproblematischer als mit einem „fremden“ strcmp()
auf den Prozess auszuführen stapeln jedes Mal, wenn der Haltepunkt getroffen wird.
Beachten Sie Ihre GDB werden muss, um mit Python-Unterstützung kompiliert, die mit aktuellen Linux-Distributionen ist kein Problem. Um sicher zu gehen, können Sie es überprüfen, indem
show configuration
innerhalb GDB läuft und die Suche nach--with-python
. Dieser kleine oneliner funktioniert der Trick, auch:$ gdb -n -quiet -batch -ex 'show configuration' | grep 'with-python' --with-python=/usr (relocatable)
Für Ihre Demo Fall würde die Nutzung sein
break <where> if $_streq(x, "hello")
oder, wenn Ihr Haltepunkt bereits vorhanden ist und Sie wollen einfach nur die Bedingung, um es hinzuzufügen
condition <breakpoint number> $_streq(x, "hello")
$_streq
passt nur die gesamte Zeichenfolge, wenn Sie also etwas mehr wollen gerissen sollten Sie $_regex
, die die Python Syntax für reguläre Ausdrücke .