GNU Debugger tai GDB: Tehokas lähdekoodin virheenkorjaustyökalu Linux-ohjelmille


Virheenkorjaajalla on tärkeä rooli kaikissa ohjelmistokehitysjärjestelmissä. Kukaan ei voi kirjoittaa virheetöntä koodia kerralla. Kehityksen aikana virheitä nostetaan ja ne on ratkaistava edelleen parantamiseksi. Kehitysjärjestelmä on epätäydellinen ilman virheenkorjainta. Kun otetaan huomioon avoimen lähdekoodin kehittäjien yhteisö, GNU Debugger on heidän paras valinta. Sitä käytetään myös kaupallisten ohjelmistojen kehittämiseen UNIX-tyyppisillä alustoilla.

GNU Debugger, joka tunnetaan myös nimellä gdb, antaa meille mahdollisuuden hiipiä koodin läpi sen suorituksen aikana tai mitä ohjelma yritti tehdä sillä hetkellä ennen kuin se kaatui. GDB auttaa periaatteessa meitä tekemään neljä pääasiaa lähdekoodin virheiden havaitsemiseksi.

  1. Käynnistä ohjelma määrittelemällä argumentit, jotka voivat vaikuttaa yleiseen käyttäytymiseen.
  2. Pysäytä ohjelma tietyissä olosuhteissa.
  3. Tutki kaatumista tai ohjelman lopettamista.
  4. Vaihda koodi ja kokeile muokattua koodia välittömästi.

Voimme käyttää gdb: tä C: ssä ja C ++: ssa kirjoitettujen ohjelmien virheenkorjaamiseen ilman paljon vaivaa. Toistaiseksi muiden ohjelmointikielien, kuten D, Modula-2, Fortran, tuki on osittaista.

GNU Debuggerin tai GDB: n käytön aloittaminen

GDB kutsutaan gdb -komennolla. Annettaessa gdb se näyttää joitain tietoja alustasta ja pudottaa sinut ( gdb ) -kehotteeseen alla olevan kuvan mukaisesti.

 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)

Kirjoita help luettelo, jos haluat selvittää gdb: n sisällä olevat komentoluokat. Kirjoita help ja sen jälkeen luokan nimi kyseisen luokan komentojen luetteloon. Kirjoita kaikkien komentojen luettelo help all . Komennonimien lyhenteet ovat sallittuja, jos ne ovat yksiselitteisiä. Voit esimerkiksi kirjoittaa n sen sijaan, että kirjoitat seuraava tai c jatka ja niin edelleen.

Yleisesti käytetyt gdb-komennot on lueteltu seuraavassa taulukossa. Näitä komentoja on käytettävä gdb-komentokehotteesta ( gdb ).

Huomaa ero komentojen vaihe ja seuraava välillä. Seuraava komento ei mene funktion sisälle, jos seuraava rivi on toimintokutsu. step -komento voi mennä sisätoimintoon ja nähdä, mitä siellä tapahtuu.

Harkitse seuraavaa lähdekoodia.

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

Tulostiedoston virheenkorjaamiseksi meidän on koottava sama -g -vaihtoehdolla gcc: lle seuraavasti.

$ gcc -g sum.c -o sum

Lähtötiedosto summa voidaan liittää gdb: hen jommallakummalla seuraavista kahdesta tavasta:

1. Määrittämällä lähtötiedosto argumentiksi gdb: lle.

$ gdb sum

2. Suorita lähtötiedosto gdb: ssä tiedosto -komennolla.

$ gdb
(gdb) file sum

list -komento listaa lähdekooditiedoston rivit ja siirtää osoitinta. Joten ensimmäinen luettelo näyttää ensimmäiset 10 riviä ja seuraava luettelo näyttää seuraavat 10 ja niin edelleen.

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

Aloita suoritus antamalla run -komento. Nyt ohjelma suoritetaan normaalisti. Mutta unohdimme laittaa lähdekoodiin joitain katkaisupisteitä virheenkorjausta varten, eikö? Nämä katkaisupisteet voidaan määrittää toiminnoille tai tietyille linjoille.

(gdb) b main

Huomaa: Olen käyttänyt tauolle lyhennystä b.

Kun taukopiste on asetettu päätoiminnolle, ohjelman uudelleenkäynnistys pysähtyy rivillä 11. Sama voidaan toteuttaa, jos linjan numero tiedetään aiemmin.

(gdb) b sum.c:11

Siirry nyt koodirivien läpi seuraava tai n -komennolla. On tärkeää huomata, että seuraava -komento ei mene toimintokoodin sisään, ellei funktiolle ole asetettu katkaisupistettä. Kokeile nyt print -komentoa. Aseta taittopiste funktion summalle alla.

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

Jos suoritettava ohjelma vaatii komentoriviparametreja, anna samat run -komennon kanssa kuin.

(gdb) run   . . .

Nykyiseen käynnissä olevaan ohjelmaan liittyvät jaetut kirjastotiedostot voidaan listata nimellä.

(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 pystyy myös muuttamaan muuttujia koko ohjelman suorituksen ajan. Kokeillaan tätä. Kuten edellä mainittiin, aseta katkaisupiste riville 16 ja suorita ohjelma.

(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

Nyt a = 1, b = 2 ja tuloksen tulisi olla z = 3. Mutta tässä muutimme pääfunktion lopputulokseksi z = 4. Tällä tavalla virheenkorjaus voidaan tehdä helpommaksi gdb: n avulla.

Saat luettelon kaikista keskeytyskohdista kirjoittamalla info breakpoints .

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

Tässä on vain yksi katkaisupiste ja se on To. käytössä poista käytöstä katkaisupisteet määritä katkaisupisteen numero yhdessä poista käytöstä -komennon kanssa. Ota jälkikäteen käyttöön enable -komento.

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

Voit myös poistaa katkaisupisteet poista -komennolla.

Lukuisat prosessit ovat käynnissä taustalla GNU/Linux-järjestelmässä. Käynnissä olevan prosessin virheenkorjaamiseksi on ensin löydettävä kyseisen prosessin prosessitunnus. pidof -komento antaa sinulle prosessin pid.

$ pidof <process_name>

Nyt meidän on liitettävä tämä pid gdb: hen. On 2 tapaa.

1. Määritä pid yhdessä gdb: n kanssa.

$ gdb -p <pid>

2. Käytä liitä -komentoa gdb: stä.

(gdb) attach <pid>

Tässä kaikki tältä erää. Nämä ovat vain gdb: n perusteita saadaksesi hyvän alun lähdekoodien virheenkorjauksessa, ja se on paljon enemmän kuin edellä selitetyt asiat. Esimerkiksi voimme suorittaa virheenkorjauksen käyttämällä pinotietoja, ympäristömuuttujia ja paljon muuta. Yritä leikkiä kaikkien näiden tavaroiden kanssa ...