Setiap pengaturcara, tidak kira betapa berpengalamannya, tidak dapat mengelak sepenuhnya pepijat dalam perisian. Oleh itu, penyelesaian masalah dan membetulkan pepijat telah menjadi salah satu tugas yang paling penting dalam kitaran pembangunan perisian. Walaupun terdapat banyak cara untuk menyelesaikan masalah pepijat, seperti ujian dan semakan kendiri kod, perisian penyahpepijat khusus juga boleh membantu menentukan masalah supaya ia boleh dibetulkan.
Bagi pengaturcara yang menggunakan bahasa pengaturcaraan C/C++ atau Fortran dan Modula-2 untuk membangunkan perisian, terdapat alat penyahpepijat yang sangat baik-GDB, yang akan menjadi berita baik untuk mereka. GDB bukan sahaja membantu pengaturcara menyahpepijat pepijat dan masalah lain dalam kod mereka dengan lebih mudah, tetapi ia juga menyediakan banyak ciri dan pilihan yang berguna. Dalam artikel ini, kami akan membincangkan beberapa asas penyahpepijat GDB, serta beberapa ciri dan pilihan berguna yang disediakannya.
Sebelum kita bermula, perlu dinyatakan bahawa semua arahan dan contoh dalam artikel telah diuji pada Ubuntu 14.04 LTS. Kod sampel dalam tutorial semuanya ditulis dalam bahasa C;
Dalam istilah orang awam, GDB membenarkan anda melihat aliran dalaman program semasa pelaksanaan dan membantu anda mengenal pasti masalah. Kami akan membincangkan penggunaan penyahpepijat GDB dengan contoh yang berfungsi dalam bahagian seterusnya, tetapi sebelum itu, mari kita bincangkan beberapa perkara asas yang akan membantu anda kemudian.
Pertama sekali, untuk berjaya menggunakan penyahpepijat seperti GDB, anda mesti menyusun atur cara dengan cara tertentu supaya pengkompil menjana maklumat penyahpepijat yang diperlukan oleh penyahpepijat. Sebagai contoh, apabila menyusun kod dengan pengkompil gcc (yang akan kami gunakan untuk menyusun contoh program C kemudian dalam tutorial ini), anda perlu menggunakan pilihan baris arahan -g.
Untuk maklumat tentang pilihan baris arahan -g dalam halaman manual pengkompil gcc, sila lihat di sini.
Seterusnya, pastikan penyahpepijat GDB dipasang pada sistem anda. Jika ia tidak dipasang, dan anda menggunakan sistem berasaskan Debian (seperti Ubuntu), maka anda boleh memasang alat tersebut dengan mudah menggunakan arahan berikut:
sudo apt-get install gdb
Untuk kaedah pemasangan pada pengedaran lain, sila lihat di sini.
Sekarang, apabila anda telah menyusun atur cara seperti yang diterangkan di atas (pilihan baris arahan gcc -g) dan memasang penyahpepijat GDB, anda boleh menggunakan arahan berikut untuk menjalankan program dalam mod nyahpepijat:
gdb [可执行程序的名称]
Melakukan ini akan memulakan penyahpepijat GDB, tetapi boleh laku anda belum lagi dimulakan. Pada ketika ini anda boleh menentukan tetapan berkaitan penyahpepijatan. Sebagai contoh, anda boleh menetapkan titik putus pada baris atau fungsi tertentu agar GDB menjeda pelaksanaan program pada baris tersebut.
Seterusnya, untuk memulakan program anda, anda mesti memasukkan dan melaksanakan arahan gdb berikut:
run
Di sini, perlu dinyatakan bahawa jika program anda memerlukan beberapa parameter baris arahan, maka anda boleh menentukan parameter ini di sini. Contohnya:
run [参数]
GDB menyediakan banyak arahan berguna, yang sentiasa berguna apabila menyahpepijat. Kami akan membincangkan beberapa arahan ini dalam bahagian seterusnya.
Kini kami mempunyai idea asas tentang GDB dan penggunaannya. Jadi mari kita gunakan apa yang telah kita pelajari dengan contoh. Berikut ialah contoh kod:
#include int main() { int out = 0, tot = 0, cnt = 0; int val[] = {5, 54, 76, 91, 35, 27, 45, 15, 99, 0}; while(cnt printf("/n Total = [%d]/n", tot); return 0; }
Terangkan secara ringkas apa yang dilakukan oleh kod ini. Dapatkan setiap nilai dalam tatasusunan val, tetapkan ia kepada pembolehubah keluar, kemudian tambah nilai sebelum tot dan nilai hasil 0xffffffff/out, dan tetapkan ia kepada pembolehubah tot.
Masalah yang dihadapi di sini ialah apabila program boleh laku yang disusun oleh kod ini dilaksanakan, ralat berikut dihasilkan:
$ ./gdb-testFloating point exception (core dumped)
Jadi, untuk nyahpepijat kod ini, langkah pertama ialah menyusun atur cara menggunakan pilihan -g
. Perintahnya adalah seperti berikut:
gcc -g -Wall gdb-test.c -o gdb-test
Seterusnya, mari jalankan penyahpepijat GDB dan tentukan program boleh laku untuk nyahpepijat. Perintahnya adalah seperti berikut:
gdb ./gdb-test
Sekarang, ralat yang baru saya perolehi ialah pengecualian titik Terapung, yang kebanyakan anda mungkin sudah tahu, disebabkan oleh n % x apabila x ialah 0. Oleh itu, dengan mengambil kira itu, saya menambah titik putus pada baris 11 di mana operasi pembahagian berlaku. Seperti berikut:
(gdb)&;break 11
Nota (gdb) ialah maklumat segera penyahpepijat, saya hanya memasukkan perintah break 11.
Sekarang, biarkan GDB mula menjalankan program:
run
Apabila titik putus dipukul buat kali pertama, GDB memaparkan output berikut:
Breakpoint 1, main () at gdb-test.c:11 11 tot = tot + 0xffffffff/out; (gdb)
Seperti yang anda lihat, penyahpepijat memaparkan baris kod di mana titik putus itu berada. Sekarang, mari kita cetak nilai keluar pada masa ini. Seperti berikut:
(gdb) print out $1 = 5 (gdb)
如上所示,值 5被打印出来了。这个时候一切都还是正常的。让调试器继续执行程序直到命中下一个断点,可以通过使用 c 命令来完成:
c
重复上述操作,直到 out值变为0 时。
... ... ... Breakpoint 1, main () at gdb-test.c:11 11 tot = tot + 0xffffffff/out; (gdb) print out $2 = 99 (gdb) c Continuing. Breakpoint 1, main () at gdb-test.c:11 11 tot = tot + 0xffffffff/out; (gdb) print out $3 = 0 (gdb)
现在,为了进一步确认问题,我使用 GDB 的s (或 step) 命令代替 c 命令。因为,我只想让当前程序在第 11 行之后暂停,再一步步执行,看看这个时候是否会发生崩溃。
以下是执行之后输出信息:
(gdb) s Program received signal SIGFPE, Arithmetic exception. 0x080484aa in main () at gdb-test.c:11 11 tot = tot + 0xffffffff/out;
是的,如上输出的第一行内容所示,这就是抛出异常的地方。当我再次尝试运行s 命令时,问题最终也得到了确认:
(gdb) s Program terminated with signal SIGFPE, Arithmetic exception. The program no longer exists.
通过这种方式,你就可以使用 GDB 调试你的程序。
GDB 提供了很多功能供用户研究和使用,在这里,我们仅仅只介绍了很少一部分内容。通过 GDB 的手册页可以进一步了解这个工具,当你在调试代码的时候,尝试使用一下它。GDB 调试器有一定的学习难度,但是它很值得你下功夫学习。
Atas ialah kandungan terperinci Injil menyahpepijat program C dalam Linux - gdb. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!