Dalam tutorial ini kita akan membahas beberapa fungsi GDB lanjutan termasuk breakpoint bersyarat, dan watchpoint.
Kami juga menggunakan program C sederhana sebagai contoh untuk menjelaskan konsep debugger GDB ini.
Breakpoint Bersyarat GDB
Breakpoint, mengerem setiap kali program Anda mencapai tempat tertentu. Anda juga dapat menentukan kondisi untuk titik henti sementara. Kondisi adalah ekspresi boolean. Breakpoint bersyarat akan rusak, hanya jika ekspresi boolean bernilai TRUE.
Asumsikan Anda memanggil fungsi untuk loop, dan setiap 500 kali, program mogok. Breakpoint bersyarat datang untuk menyelamatkan dalam situasi tersebut, di mana Anda dapat mengatur kondisi dan menghentikan eksekusi hanya jika kondisinya cocok.
#include <stdio.h> int main() { int i=0; for (i=0;i<1000;i++) { printf("%d\n",i); } }
(gdb) b 8 if i=500 Breakpoint 2 at 0x400524: file a.c, line 8. (gdb) run Starting program: /home/lakshmanan/./a.out Breakpoint 1, main () at a.c:6 6 int i=0; (gdb) c Continuing. Breakpoint 2, main () at a.c:8 8 printf("%d\n",i); (gdb) p i $1 = 500
Pada sesi gdb di atas, program berhenti ketika nilai i adalah 500.
Apa itu Watchpoint?
Watchpoint mirip dengan breakpoint yang telah kita bahas di artikel GDB – Breakpoints kami sebelumnya. Namun tidak seperti breakpoint yang disetel untuk fungsi atau baris kode, watchpoint disetel pada variabel. Ketika variabel tersebut dibaca/ditulis, watchpoint akan dipicu dan eksekusi program akan berhenti.
Harap dicatat bahwa variabel yang ingin Anda tonton harus dalam cakupan saat ini. Jadi, pastikan Anda menyetel breakpoint dalam cakupan variabel untuk menontonnya.
#include <stdio.h> int main() { int a=10; int b=15; b = a+b; printf("%d\n",b); }
$ cc -g watch.c -o watch
Mengatur Watchpoint Baca/Tulis menggunakan 'awatch'
Gunakan perintah awatch untuk mengatur watchpoint baca/tulis pada variabel. Sintaks untuk awatch adalah, 'awatch' diikuti dengan nama variabel.
$ gdb ./watch (gdb) break 1 Breakpoint 1 at 0x400514: file a.c, line 1. (gdb) run Starting program: /home/lakshmanan/Personal/./a.out Breakpoint 1, main () at a.c:4 4 int a=10; (gdb) awatch b Hardware access (read/write) watchpoint 2: b (gdb) n 5 int b=15; (gdb) n Hardware access (read/write) watchpoint 2: b Old value = 0 New value = 15 main () at a.c:7 7 b = a+b; (gdb) n Hardware access (read/write) watchpoint 2: b Old value = 15 New value = 25 main () at a.c:9 9 printf("%d\n",b);
Dalam contoh di atas, setiap kali variabel yang diberikan dibaca/ditulis, gdb mencetak nilai lama dan baru dan menghentikan eksekusi program.
Menyetel titik pengawasan baca untuk variabel menggunakan 'rwatch'
rwatch adalah perintah yang digunakan untuk mengatur read watchpoint di gdb. Setelah diatur, setiap kali variabel yang diberikan dibaca, program akan menghentikan eksekusi. Sintaksnya mirip dengan 'awatch'.
(gdb) rwatch b Hardware read watchpoint 2: b (gdb) c Continuing. Hardware read watchpoint 2: b Value = 25 0x000000000040052b in main () at a.c:9 9 printf("%d\n",b);
Demikian pula, Anda dapat menggunakan 'watch' untuk menyetel watchpoint tulis di gdb.
Menghapus titik pengawasan
Watchpoints akan ditampilkan dalam daftar breakpoints.
Jadi, Anda dapat menggunakan info breakpoints untuk membuat daftar watchpoints dan Anda dapat menghapus/menonaktifkan yang mirip dengan breakpoints seperti yang ditunjukkan di bawah ini.
(gdb) info breakpoints Num Type Disp Enb Address What 1 breakpoint keep y 0x0000000000400514 in main at a.c:1 breakpoint already hit 1 time 2 hw watchpoint keep y b breakpoint already hit 1 time (gdb) delete 2