Napaka GNU ali GDB: zmogljivo orodje za odpravljanje napak izvorne kode za programe Linux


Razhroščevalnik ima ključno vlogo v katerem koli sistemu za razvoj programske opreme. Nihče ne more napisati kode brez napak hkrati. Med razvojem se pojavljajo napake, ki jih je treba odpraviti za nadaljnje izboljšanje. Razvojni sistem je brez razhroščevalnika nepopoln. Glede na odprtokodno skupnost razvijalcev je GNU Debugger njihova najboljša izbira. Uporablja se tudi za komercialni razvoj programske opreme na platformah tipa UNIX.

GNU razhroščevalec, znan tudi kot gdb, nam omogoča, da se prikličemo skozi kodo, medtem ko se ta izvaja ali kaj je program poskušal storiti v trenutku, preden se je zrušil. GDB nam v bistvu pomaga narediti štiri glavne stvari, da odkrijemo napake v izvorni kodi.

  1. Zaženite program z navedbo argumentov, ki lahko vplivajo na splošno vedenje.
  2. Ustavite program pod določenimi pogoji.
  3. Preglejte zrušitev ali ko je bil program ustavljen.
  4. Spremenite kodo in takoj poskusite s spremenjeno kodo.

Gdb lahko brez veliko truda odpravljamo programe, napisane v jeziku C in C ++. Od zdaj je podpora za druge programske jezike, kot so D, Modula-2 in Fortran, delna.

Uvod v razhroščevalnik GNU ali GDB

GDB se prikliče z ukazom gdb . Ob izdaji gdb prikaže nekaj informacij o platformi in vas spusti v poziv ( gdb ), kot je prikazano spodaj.

 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)

Vnesite help list, da izbrišete različne razrede ukazov, ki so na voljo znotraj gdb. Vnesite pomoč , ki mu sledi ime razreda za seznam ukazov v tem razredu. Za seznam vseh ukazov vnesite help all . Omejitve ukaznih imen so dovoljene, če so nedvoumne. Na primer, lahko vnesete n , namesto da bi vnesli naslednji ali c za nadaljevanje in tako naprej.

Pogosto uporabljeni ukazi gdb so navedeni v naslednji tabeli. Te ukaze je treba uporabiti v ukaznem pozivu gdb ( gdb ).

Upoštevajte razliko med obema ukazoma korak in naslednji . Naslednji ukaz ne gre v funkcijo, če je naslednja vrstica klic funkcije. Medtem ko lahko ukaz step vstopi v notranjo funkcijo in vidi, kaj se tam zgodi.

Upoštevajte naslednjo izvorno kodo.

// 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; 
}

Za odpravljanje napak v izhodni datoteki moramo enako z -g prevesti v gcc, kot sledi.

$ gcc -g sum.c -o sum

Izhodno datoteko vsoto lahko priložite gdb na enega od naslednjih dveh načinov:

1. Z navedbo izhodne datoteke kot argumenta gdb.

$ gdb sum

2. Zagon izhodne datoteke znotraj gdb z ukazom datoteka .

$ gdb
(gdb) file sum

Ukaz seznam vsebuje vrstice v datoteki izvorne kode in premakne kazalec. Torej bo prvi seznam prikazal prvih 10 vrstic, naslednji seznam pa naslednjih 10 in tako naprej.

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

Če želite začeti izvajanje, izdajte ukaz run . Zdaj se program izvaja normalno. Toda v izvorno kodo za odpravljanje napak smo pozabili vstaviti nekaj mejnih točk, kajne? Te mejne vrednosti lahko določite za funkcije ali v določenih vrsticah.

(gdb) b main

Opomba: Za odmor sem uporabil okrajšavo b.

Po nastavitvi točke odmora na glavni funkciji se bo ponovni zagon programa ustavil na vrstici 11. Enako je mogoče uveljaviti, če je številka vrstice že znana.

(gdb) b sum.c:11

Zdaj stopite skozi vrstice kode z ukazom naslednji ali n . Pomembno je vedeti, da naslednji ukaz ne gre znotraj kode funkcije, razen če je v funkciji nastavljena točka prekinitve. Preizkusimo zdaj ukaz print . Kot v nadaljevanju nastavite prelomno točko na vsoti funkcije.

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

Če program, ki se izvaja, zahteva parametre ukazne vrstice, potem skupaj z ukazom run podajte enako kot.

(gdb) run   . . .

Datoteke knjižnice v skupni rabi, povezane s trenutno zagnanim programom, so lahko navedene kot.

(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 lahko tudi spreminja spremenljivke med izvajanjem programa. Preizkusimo to. Kot smo že omenili, v vrstici 16 nastavite točko preloma in zaženite 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

Zdaj je a = 1, b = 2 in rezultat mora biti z = 3. Toda tu smo v glavni funkciji spremenili končni rezultat na z = 4. Na ta način lahko odpravljanje napak olajšate s pomočjo gdb.

Če želite dobiti seznam vseh mejnih vrednosti, vnesite info breakpoints .

(gdb) info breakpoints 
Num     Type           Disp Enb Address            What 
1       breakpoint     keep y   0x00000000004005c2 in main at sum.c:11

Tu je samo ena prelomna točka in je To. omogočeno onemogoči prekinitvene točke podajte številko prekinitvene točke skupaj z ukazom onemogoči . Če želite pozneje omogočiti, uporabite ukaz omogoči .

(gdb) disable 1 
(gdb) info breakpoints 
Num     Type           Disp Enb Address            What 
1       breakpoint     keep n   0x00000000004005c2 in main at sum.c:11

Prekinitvene točke lahko tudi izbrišete z ukazom delete .

V ozadju v sistemu GNU/Linux tečejo številni procesi. Za razhroščevanje tekočega postopka moramo najprej najti ID procesa tega določenega procesa. ukaz pidof vam poda pid procesa.

$ pidof <process_name>

Zdaj moramo ta pid pritrditi na gdb. Obstajata dva načina.

1. Z navedbo pid skupaj z gdb.

$ gdb -p <pid>

2. Uporaba ukaza priloži iz gdb.

(gdb) attach <pid>

To je vse za zdaj. To so samo osnove gdb za dober začetek razhroščevanja izvorne kode in je veliko več kot zgoraj pojasnjeno. Na primer, lahko odpravimo napake z uporabo informacij o skladu, spremenljivk okolja in še veliko več. Poskusite se poigrati z vsemi temi stvarmi ...