„GNU Debugger“ arba „GDB“: galingas šaltinio kodo derinimo įrankis, skirtas „Linux“ programoms


Derintojas vaidina svarbų vaidmenį bet kurioje programinės įrangos kūrimo sistemoje. Niekas negali iš karto parašyti kodo be klaidų. Kūrimo metu yra iškeliamos klaidos, kurias reikia išspręsti, norint jas toliau tobulinti. Kūrimo sistema nėra išsami be derintuvo. Atsižvelgiant į atvirojo kodo kūrėjų bendruomenę, „GNU Debugger“ yra geriausias jų pasirinkimas. Jis taip pat naudojamas komercinei programinei įrangai kurti UNIX tipo platformose.

„GNU Debugger“, dar žinomas kaip „gdb“, leidžia mums peršokti kodą, kai jis vykdomas, arba ką programa bandė padaryti tuo metu, kol jis užstrigo. GDB iš esmės padeda mums atlikti keturis pagrindinius dalykus, kad išgautume šaltinio kodo trūkumus.

  1. Paleiskite programą nurodydami argumentus, kurie gali paveikti bendrą elgesį.
  2. Sustabdykite programą nurodytomis sąlygomis.
  3. Išnagrinėkite avariją arba kada programa buvo sustabdyta.
  4. Pakeiskite kodą ir nedelsdami eksperimentuokite su modifikuotu kodu.

Mes galime naudoti gdb be didelių pastangų derinti programas, parašytas C ir C ++. Šiuo metu kitų programavimo kalbų, tokių kaip D, „Modula-2“, „Fortran“, palaikymas yra dalinis.

Darbo su „GNU Debugger“ arba „GDB“ pradžia

GDB iškviečiamas naudojant komandą gdb . Išduodant gdb jis pateikia tam tikrą informaciją apie platformą ir nukreipia jus į ( gdb ) eilutę, kaip parodyta žemiau.

 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)

Įveskite help list, kad išvardytumėte įvairias komandų klases, galimas gdb. Įveskite help ir klasės pavadinimą, kad pateiktumėte tos klasės komandų sąrašą. Visų komandų sąraše įveskite help all . Komandų pavadinimų sutrumpinimai leidžiami, jei jie yra nedviprasmiški. Pvz., Galite įvesti n vietoj to, kad įvestumėte kitas arba c tęsti ir pan.

Dažniausiai naudojamos „gdb“ komandos pateikiamos šioje lentelėje. Šios komandos turi būti naudojamos iš „gdb“ komandų eilutės ( gdb ).

Atkreipkite dėmesį į skirtumą tarp dviejų komandų žingsnis ir kitas . Kita komanda neįeina į funkcijos vidų, jei kita eilutė yra funkcijos iškvietimas. step komanda gali eiti į vidinę funkciją ir pamatyti, kas ten vyksta.

Apsvarstykite šį šaltinio 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; 
}

Norėdami derinti išvesties failą, turime sukompiliuoti tą patį naudodami parinktį -g į gcc taip.

$ gcc -g sum.c -o sum

Išvesties failą sum galima pridėti prie „gdb“ vienu iš šių dviejų būdų:

1. Nurodydami išvesties failą kaip argumentą gdb.

$ gdb sum

2. Paleiskite išvesties failą gdb viduje naudodami komandą failas .

$ gdb
(gdb) file sum

Komanda list išvardija eilutes šaltinio kodo faile ir perkelia žymeklį. Taigi pirmas sąrašas parodys pirmąsias 10 eilučių, o kitas sąrašas rodys kitas 10 ir pan.

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

Norėdami pradėti vykdyti, išleiskite komandą paleisti . Dabar programa vykdoma paprastai. Bet mes pamiršome įdėti keletą lūžio taškų į šaltinio kodą derinimui, tiesa? Šiuos lūžio taškus galima nurodyti funkcijoms arba nurodytose linijose.

(gdb) b main

Pastaba: pertraukai naudojau b santrumpą.

Nustačius pertraukos tašką pagrindinėje funkcijoje, programos pakartotinis vykdymas sustos ties 11 linija. Tą patį galima įgyvendinti, jei linijos numeris yra žinomas anksčiau.

(gdb) b sum.c:11

Dabar pereikite per kodo eilutes naudodami komandą kitas arba n . Svarbu pažymėti, kad komanda next neįeina į funkcijos kodą, nebent funkcijai nustatytas lūžio taškas. Išbandykime komandą print dabar. Funkcijos sumoje nustatykite lūžio tašką, kaip nurodyta toliau.

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

Jei vykdomajai programai reikalingi komandinės eilutės parametrai, kartu su run komanda pateikite tuos pačius parametrus kaip ir.

(gdb) run   . . .

Bendros bibliotekos failai, susieti su dabartine vykdoma programa, gali būti išvardyti kaip.

(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 taip pat gali modifikuoti kintamuosius vykdant programą. Išbandykime tai. Kaip minėta pirmiau, nustatykite lūžio tašką 16 eilutėje ir paleiskite 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

Dabar a = 1, b = 2, o rezultatas turėtų būti z = 3. Bet čia pagrindinėje funkcijoje galutinį rezultatą pakeitėme į z = 4. Tokiu būdu derinimą galima palengvinti naudojant „gdb“.

Norėdami gauti visų pertraukimo taškų sąrašą, įveskite informacijos lūžio taškai .

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

Čia yra tik vienas lūžio taškas ir tai yra. įjungta išjungti pertraukimo taškus nurodykite pertraukos taško numerį kartu su komanda išjungti . Jei norite įgalinti vėliau, naudokite komandą enable .

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

Pertraukos taškus taip pat galite ištrinti naudodami komandą delete .

GNU/Linux sistemoje fone vyksta daugybė procesų. Norėdami derinti vykdomą procesą, pirmiausia turime rasti to konkretaus proceso ID. pidof komanda suteikia jums proceso pid.

$ pidof <process_name>

Dabar turime pridėti šį pid prie gdb. Yra 2 būdai.

1. Nurodydami pid kartu su gdb.

$ gdb -p <pid>

2. Naudokite komandą attach iš gdb.

(gdb) attach <pid>

Kol kas viskas. Tai yra tik „gdb“ pagrindai, norint gerai pradėti derinti šaltinio kodą, ir tai yra daug daugiau nei aukščiau paaiškinti dalykai. Pavyzdžiui, mes galime derinti naudodami informaciją apie kaminą, aplinkos kintamuosius ir daug daugiau. Pabandykite pažaisti su visais šiais produktais ...