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.

  1. Pokrenite program, navodeći argumente koji mogu utjecati na opće ponašanje.
  2. Zaustavite program pod određenim uvjetima.
  3. Ispitajte pad ili kada je program zaustavljen.
  4. 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 ...