GDB: putus jika nilai variabel sama

89

Saya suka membuat GDB menetapkan titik istirahat ketika variabel sama dengan beberapa nilai yang saya tetapkan, saya mencoba contoh ini:

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

     return 0;
}

Keluaran dari 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)

Seperti yang Anda lihat, GDB tidak membuat break point, apakah ini mungkin dengan GDB?

SIFE
sumber

Jawaban:

125

selain watchpoint yang bersarang di dalam breakpoint, Anda juga bisa menyetel breakpoint tunggal pada 'filename: line_number' dan menggunakan kondisi. Saya merasa terkadang lebih mudah.

(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);

Jika seperti saya Anda bosan dengan nomor baris yang berubah, Anda dapat menambahkan label kemudian mengatur breakpoint pada label seperti ini:

#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
sumber
30

Anda dapat menggunakan watchpoint untuk ini (Breakpoint pada data, bukan kode).

Anda bisa mulai dengan menggunakan watch i.
Kemudian tetapkan kondisi untuk itu menggunakancondition <breakpoint num> i == 5

Anda bisa mendapatkan nomor breakpoint dengan menggunakan info watch

saya asli
sumber
3
(gdb) watch i No symbol "i" in current context.
SIFE
2
Anda harus berada di tempat dalam kode yang iada. Coba break main, run, c, s(langkah untuk memastikan Anda melewati deklarasi), dan kemudian perintah pada jawaban. Pastikan untuk mengkompilasi program Anda dengan -gflag tersebut. (yaitu dengan informasi debug)
imreal
Sebelum eksekusi dimulai, unit / file kompilasi lain yang ditautkan ke executable utama Anda mungkin belum dimuat. Sebuah pilihan yang bagus untuk digunakan kemudian start <args>, yang seperti tb main, run <args>. Ini akan memulai program, memungkinkan Anda untuk mengatur titik istirahat / menonton dengan lebih mudah.
JWCS
9

Pertama, Anda perlu mengompilasi kode Anda dengan flag yang sesuai, mengaktifkan debug menjadi kode.

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

lalu jalankan kode Anda dengan debugger favorit Anda

$ gdb ./ex1

tunjukkan kodenya.

(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   }

putus pada baris 5 dan lihat jika 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

memeriksa breakpoints

(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

menjalankan program

(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
sumber
4

Ada pengawasan perangkat keras dan perangkat lunak. Mereka untuk membaca dan menulis variabel. Anda perlu berkonsultasi dengan tutorial:

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

Untuk mengatur watchpoint, pertama Anda perlu memecah kode ke tempat di mana varian i ada di lingkungan, dan mengatur watchpoint.

watchperintah digunakan untuk mengatur watchpoit untuk menulis, rwatchmembaca, dan awatchmembaca / menulis.

alinsoar
sumber