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?
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
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
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:
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.
14213200cookie-checkGDB: Break wenn Variable gleicher Wertyes