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

Lesezeit: 3 Minuten

Benutzeravatar von 341008
341008

Kann ich angeben, dass ich möchte, dass gdb bei Zeile x unterbricht, wenn char* x zeigt auf eine Zeichenfolge, deren Wert gleich ist "hello"? Wenn ja, wie?

  • Notiz: strncmp und strstr sind weitere nützliche C-Abfragefunktionen.

    – Ciro Santilli OurBigBook.com

    27. Juli 2015 um 20:50 Uhr

Benutzeravatar von Nathan Fellman
Nathan Fellmann

Sie können verwenden strcmp:

break x:20 if strcmp(y, "hello") == 0

20 ist Zeilennummer, x kann ein beliebiger Dateiname sein und y kann jede Variable sein.

  • Hinweis: Sie müssen das Programm bereits ausführen, damit GDB die stdlib sieht. Andernfalls: No symbol "strcmp" in current context.

    – Ciro Santilli OurBigBook.com

    27. Juli 2015 um 20:45 Uhr

  • @CiroSantilli六四事件法轮功包卓轩: Wie konfiguriere ich gdb, um die stdlib anzuzeigen?

    – naiv231

    13. November 2015 um 2:48 Uhr

  • @ naive231 mit “see” meinte ich see-Funktionen, damit Sie an ihnen brechen können, nicht an der Quelle: Sie müssen treffen run dafür, damit dynamische Bibliotheken geladen werden. Für die Quelle googeln Sie es und finden Sie: stackoverflow.com/questions/10000335/… 🙂

    – Ciro Santilli OurBigBook.com

    13. November 2015 um 9:52 Uhr


  • Diese Methode kann Nebenwirkungen haben. $_streq Methode von @tlwhitec ist besser.

    – Rollen

    14. April 2019 um 14:08 Uhr

Benutzeravatar von tlwhitec
tlwhitec

Verwenden ein Bedingung brechen mit $_streq (eine von GDBs eigenen Komfortfunktionen):

break [where] if $_streq(x, "hello")

oder, wenn Ihr Haltepunkt bereits existiert, fügen Sie ihm die Bedingung hinzu:

condition <breakpoint number> $_streq(x, "hello")

Seit GDB 7.5 (vor langer Zeit) Sie können das und eine Handvoll anderer nativer verwenden Komfortfunktionen für verschiedene String-Matching, einschließlich $_regex was die unterstützt Python-Regex-Syntax:

$_memeq(buf1, buf2, length)
$_regex(str, regex)
$_streq(str1, str2)
$_strlen(str)

Diese sind weniger problematisch, als das Übliche ausführen zu müssen strcmp() in den Stack des Prozesses injiziert, da dies unerwünschte Nebenwirkungen haben kann.

Leider ist die Verwendung der nativen Funktionen nicht immer möglich, da sie darauf angewiesen sind, dass GDB mit Python-Unterstützung kompiliert wird. Dies ist normalerweise die Standardeinstellung, aber einige eingeschränkte Umgebungen haben sie möglicherweise nicht. Um sicherzugehen, können Sie es durch Laufen überprüfen show configuration in GDB und suchen nach --with-python. Dieser Shell-Oneliner macht es auch:

gdb -n -quiet -batch -ex 'show configuration' | grep 'with-python'

  • “Aber einige eingeschränkte Umgebungen haben es möglicherweise nicht.” Tatsächlich bietet die libc für eingebettete Systeme nicht immer eine malloc()-Funktion, sodass gdb strcmp() nicht aufrufen kann. In diesem Fall wird $_streq() bevorzugt, danke für den Tipp!

    – Dalí

    31. August 2021 um 12:15 Uhr

  • @Dali In einer Umgebung, die so abgespeckt ist, dass es keine gibt mallocich würde auch keine Python-Laufzeit erwarten 🙂 Ich bin mir auch ziemlich sicher strcmp nutzt nicht malloc überhaupt, also muss ich sagen, dass ich von deinem Kommentar ziemlich verwirrt bin 🙂 Meine Empfehlung zu vermeiden strcmp ergibt sich aus der Tatsache, dass es Nebenwirkungen haben kann (durch das Debuggen Ihres Programms fügen Sie also etwas ein, das sonst nicht vorhanden wäre). Ich bin auf dieses Problem gestoßen, als ich einen Prozess mit vielen Threads debuggte, wo ich verwendet habe strcmp in gdb brach gerade der ganze Prozess.

    – tlwhitec

    31. August 2021 um 13:21 Uhr

  • “In einer so abgespeckten Umgebung, dass es kein Malloc gibt, würde ich auch keine Python-Laufzeit erwarten :)” In meinem Fall wird gdb als Teil einer Cross-Compilation-Umgebung verwendet. Das Programm läuft auf dem eingebetteten System, Gdb-Client auf einem Linux-Host. Also ja, mein GDB-Client wurde mit Python-Unterstützung erstellt.

    – Dalí

    3. September 2021 um 15:06 Uhr

  • “Meine Empfehlung, strcmp zu vermeiden, ergibt sich aus der Tatsache, dass es Nebenwirkungen haben kann (durch das Debuggen Ihres Programms fügen Sie also etwas ein, das sonst nicht vorhanden wäre).” Ihre Antwort kann zum Glück mehr Probleme lösen als die, auf die Sie gestoßen sind, das meinte ich.

    – Dalí

    3. September 2021 um 15:08 Uhr

  • strcmp-Aufrufe zeigen auf Ihre debuggte Programmimplementierung. Hier ist eine gdb-Ausgabe zur Veranschaulichung: (gdb) call strcmp(“hello”, “world”) Die Auswertung dieses Ausdrucks erfordert, dass das Programm eine Funktion “malloc” hat.

    – Dalí

    3. September 2021 um 15:10 Uhr


Benutzeravatar von Tobias Domhan
Tobias Domhan

break x if ((int)strcmp(y, "hello")) == 0

Bei einigen Implementierungen kennt gdb möglicherweise den Rückgabetyp von strcmp nicht. Das heißt, du müsstest casten, sonst würde es immer als true gewertet werden!

1425340cookie-checkWie setze ich einen bedingten Haltepunkt in gdb, wenn char* x auf eine Zeichenfolge zeigt, deren Wert gleich “hello” ist?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy