Wie richte ich einen bedingten Haltepunkt in GDB, wenn char * x verweist auf eine Zeichenfolge, deren Wert gleich „Hallo“?

StackOverflow https://stackoverflow.com/questions/4183871

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?

War es hilfreich?

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 .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top