GDB: break wenn Variable gleichwertig ist

89

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 dies mit GDB möglich?

SIFE
quelle

Antworten:

123

Zusätzlich zu einem in einem Haltepunkt verschachtelten Überwachungspunkt können Sie auch einen einzelnen Haltepunkt für den Dateinamen 'line_number' festlegen 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 wie ich es satt haben, Zeilennummern zu ändern, können Sie eine Beschriftung hinzufügen und dann den Haltepunkt auf der Beschriftung 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
matt
quelle
30

Sie können hierfür einen Überwachungspunkt verwenden (Ein Haltepunkt für Daten anstelle von Code).

Sie können mit beginnen watch i.
Stellen Sie dann mit eine Bedingung dafür eincondition <breakpoint num> i == 5

Sie können die Haltepunktnummer mithilfe von abrufen info watch

Ich bin echt
quelle
3
(gdb) watch i No symbol "i" in current context.
SIFE
2
Sie müssen sich an einer Stelle im Code befinden, an der sie ivorhanden ist. Versuchen Sie break main, run, c, s(Schritt sicherstellen , dass Sie über die Erklärung bekommen), und dann die Befehle auf die Antwort. Stellen Sie sicher, dass Sie Ihr Programm mit dem -gFlag kompilieren . (dh mit Debug-Informationen)
imreal
9

Zunächst müssen Sie Ihren Code mit den entsprechenden Flags kompilieren, um das Debuggen in 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   }

brechen Sie in Zeile 5 und schauen Sie, ob i == 5.

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

Haltepunkte überprü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

Programm ausführen

(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)
Alexandre Mulatinho
quelle
4

Es gibt Hardware- und Software-Überwachungspunkte. 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 aufteilen, an der das varianle i in der Umgebung vorhanden ist, und den Überwachungspunkt festlegen.

watchMit dem Befehl wird ein Watchpoit zum Schreiben, rwatchzum Lesen und awatchzum Lesen / Schreiben festgelegt.

Alinsoar
quelle