GNU program za ispravljanje pogrešaka ili GDB: moćan alat za ispravljanje pogrešaka izvornog koda za Linux programe
Program za ispravljanje pogrešaka igra vitalnu ulogu u bilo kojem sustavu za razvoj softvera. Nitko ne može odjednom napisati kod bez grešaka. Tijekom razvoja, bugovi se podižu i treba ih riješiti radi daljnjeg poboljšanja. Razvojni sustav je nepotpun bez programa za ispravljanje pogrešaka. S obzirom na zajednicu programera otvorenog koda, GNU Debugger je njihov najbolji izbor. Također se koristi za komercijalni razvoj softvera na platformama tipa UNIX.
GNU program za ispravljanje pogrešaka, poznat i kao gdb, omogućuje nam da se provučemo kroz kôd dok se izvršava ili što je program pokušavao učiniti u trenutku prije pada. GDB nam u osnovi pomaže napraviti četiri glavne stvari kako bismo ulovili nedostatke u izvornom kodu.
- Pokrenite program, navodeći argumente koji mogu utjecati na opće ponašanje.
- Zaustavite program pod određenim uvjetima.
- Ispitajte pad ili kada je program zaustavljen.
- Promijenite kôd i trenutno eksperimentirajte s izmijenjenim kodom.
Gdb možemo koristiti za uklanjanje pogrešaka u programima napisanim na C i C ++ bez puno truda. Od sada je podrška za druge programske jezike poput D, Modula-2 i Fortran djelomična.
Početak rada s GNU programom za uklanjanje pogrešaka ili GDB-om
GDB se poziva pomoću naredbe gdb . Pri izdavanju gdb prikazuje neke informacije o platformi i ispušta vas u upit ( gdb ) kao što je prikazano u nastavku.
gdb
GNU gdb (GDB) Fedora 7.6.50.20130731-19.fc20 Copyright (C) 2013 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-redhat-linux-gnu". Type "show configuration" for configuration details. For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>. Find the GDB manual and other documentation resources online at: <http://www.gnu.org/software/gdb/documentation/>. For help, type "help". Type "apropos word" to search for commands related to "word". (gdb)
Upišite help list da biste istakli različite klase naredbi dostupnih unutar gdb-a. Upišite pomoć nakon čega slijedi naziv klase za popis naredbi u toj klasi. Upišite help all za popis svih naredbi. Kratice naziva naredbi dopuštene su ako su jednoznačne. Na primjer, možete upisati n umjesto da upišete next ili c za continue i tako dalje.
Uobičajene gdb naredbe navedene su u sljedećoj tablici. Te se naredbe koriste iz naredbenog retka gdb ( gdb ).
Obratite pažnju na razliku između dvije naredbe korak i sljedeća . Sljedeća naredba ne ulazi u funkciju ako je sljedeći redak poziv funkcije. Dok naredba step može ući u unutarnju funkciju i vidjeti što se tamo događa.
Razmotrite sljedeći izvorni kod.
// sum.c #include <stdio.h> int sum (int a, int b) { int c; c = a + b; return c; } int main() { int x, y, z; printf("\nEnter the first number: "); scanf("%d", &x); printf("Enter the second number: "); scanf("%d", &y); z = sum (x, y); printf("The sum is %d\n\n", z); return 0; }
Da bismo otklonili pogreške u izlaznoj datoteci, moramo istu kompilirati s -g opcijom u gcc, kako slijedi.
$ gcc -g sum.c -o sum
Izlazna datoteka sum može se priložiti gdb-u na jedan od sljedeća 2 načina:
1. Određivanjem izlazne datoteke kao argumenta za gdb.
$ gdb sum
2. Pokretanje izlazne datoteke unutar gdb-a pomoću naredbe datoteka .
$ gdb (gdb) file sum
Naredba lista navodi redove u datoteci izvornog koda i pomiče pokazivač. Dakle, prvi popis prikazat će prvih 10 redaka, a sljedeći popis sljedećih 10 i tako dalje.
(gdb) list 1 #include <stdio.h> 2 3 int sum (int a, int b) { 4 int c; 5 c = a + b; 6 return c; 7 } 8 9 int main() { 10 int x, y, z;
Da biste započeli izvršenje, izdajte naredbu run . Sad se program izvršava normalno. Ali zaboravili smo staviti neke točke prekida u izvorni kod za otklanjanje pogrešaka, zar ne? Te se točke prekida mogu odrediti za funkcije ili na određene linije.
(gdb) b main
Napomena: Koristio sam kraticu b za break.
Nakon postavljanja točke prekida na glavnoj funkciji, ponovno pokretanje programa zaustavit će se na liniji 11. Ista stvar može se primijeniti ako je broj linije poznat prije.
(gdb) b sum.c:11
Sada prođite kroz retke koda pomoću naredbe next ili n . Važno je napomenuti da naredba next ne ulazi u funkcijski kôd ako na funkciji nije postavljena točka prekida. Isprobajmo naredbu print sada. Postavite točku prekida na zbroju funkcije kao što je prikazano u nastavku.
(gdb) b sum Breakpoint 1 at 0x4005aa: file sum.c, line 5. (gdb) r Starting program: /root/sum Enter the first number: 2 Enter the second number: 3 Breakpoint 1, sum (a=2, b=3) at sum.c:5 5 c = a + b; (gdb) p a $1 = 2 (gdb) p b $2 = 3 (gdb) c Continuing. The sum is 5 [Inferior 1 (process 3444) exited normally]
Ako program koji se izvodi zahtijeva parametre naredbenog retka, pružite isti zajedno s naredbom pokrenite kao.
(gdb) run . . .
Datoteke zajedničke knjižnice povezane s trenutnim pokrenutim programom mogu se navesti kao.
(gdb) info share From To Syms Read Shared Object Library 0x00000035a6000b10 0x00000035a6019c70 Yes /lib64/ld-linux-x86-64.so.2 0x00000035a641f560 0x00000035a6560bb4 Yes /lib64/libc.so.6
GDB je također sposoban mijenjati varijable tijekom izvođenja programa. Isprobajmo ovo. Kao što je gore spomenuto, postavite točku prekida na liniju 16 i pokrenite program.
(gdb) r Starting program: /root/sum Enter the first number: 1 Enter the second number: 2 Breakpoint 1, main ( ) at sum.c:16 16 printf("The sum is %d\n\n", z); (gdb) set z=4 (gdb) c Continuing. The sum is 4
Sada je a = 1, b = 2 i rezultat bi trebao biti z = 3. Ali ovdje smo promijenili konačni rezultat u z = 4 u glavnoj funkciji. Na taj se način ispravljanje pogrešaka može olakšati pomoću gdb-a.
Da biste dobili popis svih točaka prekida, upišite info točke prijelaza .
(gdb) info breakpoints Num Type Disp Enb Address What 1 breakpoint keep y 0x00000000004005c2 in main at sum.c:11
Ovdje postoji samo jedna točka prekida i to To. omogućeno onemogućavanje točaka prekida navedite broj točke prekida zajedno s naredbom onemogući . Da biste ga kasnije omogućili, upotrijebite naredbu enable .
(gdb) disable 1 (gdb) info breakpoints Num Type Disp Enb Address What 1 breakpoint keep n 0x00000000004005c2 in main at sum.c:11
Točke prekida također možete izbrisati pomoću naredbe delete .
Brojni se procesi izvode u pozadini u GNU/Linux sustavu. Da bismo prvo otklonili pogreške u tekućem procesu, moramo pronaći ID tog određenog procesa. Naredba pidof daje vam pid procesa.
$ pidof <process_name>
Sada moramo priložiti ovaj pid na gdb. Postoje 2 načina.
1. Određivanjem pid uz gdb.
$ gdb -p <pid>
2. Korištenjem priloži naredbu iz gdb-a.
(gdb) attach <pid>
To je sve za sada. Ovo su samo osnove gdb-a za dobar početak ispravljanja pogrešaka izvornog koda, a to je mnogo više od gore objasnjenih stvari. Na primjer, možemo ispraviti pogreške pomoću podataka o steku, varijabli okoline i puno više. Pokušajte se poigrati sa svim tim stvarima ...