GDB: Break wenn Variable gleicher Wert

Lesezeit: 3 Minuten

Benutzeravatar von SIFE
SIFE

Ich möchte, dass GDB einen Haltepunkt setzt, wenn eine Variable einem von mir festgelegten Wert entspricht. Ich habe dieses Beispiel ausprobiert:

#include <stdio.h>
main()
{ 
     int i = 0;
     for(i=0;i<7;++i)
        printf("%d\n", i);

     return 0;
}

Ausgabe von GDB:

(gdb) break if ((int)i == 5)
No default breakpoint address now.
(gdb) run
Starting program: /home/SIFE/run 
0
1
2
3
4
5
6

Program exited normally.
(gdb)

Wie Sie sehen, hat GDB keinen Haltepunkt gesetzt, ist das mit GDB möglich?

Benutzeravatar von matt
matt

Zusätzlich zu einem Watchpoint, der in einem Breakpoint verschachtelt ist, können Sie auch einen einzelnen Breakpoint auf ‚filename:line_number‘ setzen und eine Bedingung verwenden. Ich finde es manchmal einfacher.

(gdb) break iter.c:6 if i == 5
Breakpoint 2 at 0x4004dc: file iter.c, line 6.
(gdb) c
Continuing.
0
1
2
3
4

Breakpoint 2, main () at iter.c:6
6           printf("%d\n", i);

Wenn Sie es wie ich satt haben, Zeilennummern zu ändern, können Sie ein Label hinzufügen und dann den Haltepunkt auf dem Label wie folgt festlegen:

#include <stdio.h>
main()
{ 
     int i = 0;
     for(i=0;i<7;++i) {
       looping:
        printf("%d\n", i);
     }
     return 0;
}

(gdb) break main:looping if i == 5

Benutzeravatar von imreal
Ich bin echt

Sie können dafür einen Watchpoint verwenden (ein Haltepunkt für Daten anstelle von Code).

Sie können beginnen, indem Sie verwenden watch i.
Stellen Sie dann eine Bedingung dafür mit ein condition <breakpoint num> i == 5

Sie können die Haltepunktnummer erhalten, indem Sie verwenden info watch

  • (gdb) watch i No symbol "i" in current context.

    – SIFE

    18. Januar 2013 um 0:12 Uhr

  • Sie müssen sich an einer Stelle im Code befinden, an der i existiert. Versuchen break main, run, c, s (Schritt, um sicherzustellen, dass Sie die Deklaration hinter sich haben) und dann die Befehle für die Antwort. Achten Sie darauf, Ihr Programm mit dem zu kompilieren -g Flagge. (dh mit Debug-Informationen)

    – Ich bin echt

    18. Januar 2013 um 0:14 Uhr


  • Bevor die Ausführung beginnt, sind andere Kompilierungseinheiten/Dateien, die mit Ihrer ausführbaren Hauptdatei verknüpft sind, möglicherweise noch nicht geladen. Eine raffinierte Option ist dann zu verwenden start <args>das ist wie tb main, run <args>. Dadurch wird das Programm gestartet, sodass Sie Unterbrechungs-/Überwachungspunkte einfacher festlegen können.

    – JWCS

    15. Oktober 2020 um 14:07 Uhr

Benutzeravatar von Alexandre Mulatinho
Alexandre Mulatinho

Zuerst müssen Sie Ihren Code mit den entsprechenden Flags kompilieren, um das Debuggen in den Code zu ermöglichen.

$ gcc -Wall -g -ggdb -o ex1 ex1.c

Führen Sie dann einfach Ihren Code mit Ihrem bevorzugten Debugger aus

$ gdb ./ex1

Zeig mir den Code.

(gdb) list
1   #include <stdio.h>
2   int main(void)
3   { 
4     int i = 0;
5     for(i=0;i<7;++i)
6       printf("%d\n", i);
7   
8     return 0;
9   }

break in Zeile 5 und schaut, ob i == 5 ist.

(gdb) b 5
Breakpoint 1 at 0x4004fb: file ex1.c, line 5.
(gdb) rwatch i if i==5
Hardware read watchpoint 5: i

Haltepunkte prüfen

(gdb) info b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x00000000004004fb in main at ex1.c:5
    breakpoint already hit 1 time
5       read watchpoint keep y                      i
    stop only if i==5

Ausführen des Programms

(gdb) c
Continuing.
0
1
2
3
4
Hardware read watchpoint 5: i

Value = 5
0x0000000000400523 in main () at ex1.c:5
5     for(i=0;i<7;++i)

Es gibt Hardware- und Software-Watchpoints. Sie dienen zum Lesen und Schreiben einer Variablen. Sie müssen ein Tutorial konsultieren:

http://www.unknownroad.com/rtfm/gdbtut/gdbwatch.html

Um einen Überwachungspunkt festzulegen, müssen Sie zuerst den Code an einer Stelle aufbrechen, an der die Variable i in der Umgebung vorhanden ist, und den Überwachungspunkt festlegen.

watch Befehl wird verwendet, um einen Watchpoint für das Schreiben zu setzen, während rwatch zum Lesen u awatch zum Lesen/Schreiben.

1421320cookie-checkGDB: Break wenn Variable gleicher Wert

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

Privacy policy