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


Debuggerilla on tärkeä rooli kaikissa ohjelmistokehitysjärjestelmissä. Kukaan ei voi kirjoittaa virheetöntä koodia kerralla. Kehityksen aikana bugeja nostetaan esiin, ja ne on ratkaistava edelleen parantamista varten. Kehitysjärjestelmä on epätäydellinen ilman debuggeria. Kun otetaan huomioon avoimen lähdekoodin kehittäjäyhteisö, GNU Debugger on heidän paras valintansa. Sitä käytetään myös kaupalliseen ohjelmistokehitykseen UNIX-tyyppisillä alustoilla.

GNU Debugger, joka tunnetaan myös nimellä gdb, antaa meille mahdollisuuden livahtaa koodin läpi, kun se suoritetaan tai mitä ohjelma yritti tehdä ennen kaatumista. GDB pohjimmiltaan auttaa meitä tekemään neljä pääasiaa löytääksemme lähdekoodin puutteet.

  1. Käynnistä ohjelma ja määritä argumentit, jotka voivat vaikuttaa yleiseen toimintaan.
  2. Pysäytä ohjelma tietyissä olosuhteissa.
  3. Tarkista kaatuminen tai ohjelman pysäyttäminen.
  4. Vaihda koodi ja kokeile muokattua koodia välittömästi.

Voimme käyttää gdb:tä virheenkorjaukseen C- ja C++-kielellä kirjoitetuista ohjelmista ilman paljon vaivaa. Toistaiseksi tuki muille ohjelmointikielille, kuten D, Modula-2 ja Fortran, on osittainen.

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

GDB kutsutaan gdb-komennolla. Kun gdb annetaan, se näyttää tietoja alustasta ja ohjaa sinut (gdb) -kehotteeseen alla olevan kuvan mukaisesti. .

[root@fedora20 ~]# gdb
Näytelähtö
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 list nähdäksesi gdb:ssä käytettävissä olevat eri komentoluokat. Kirjoita help ja sen jälkeen luokan nimi nähdäksesi luettelon kyseisen luokan komentoista. Kirjoita help all nähdäksesi luettelon kaikista komennoista. Komentojen nimien lyhenteet ovat sallittuja, jos ne ovat yksiselitteisiä. Voit esimerkiksi kirjoittaa n sen sijaan, että kirjoitat seuraava tai c jatka ja niin edelleen.

Yleisimmin käytetyt GDB-komennot

Yleisesti käytetyt gdb-komennot on lueteltu seuraavassa taulukossa. Näitä komentoja tulee käyttää gdb-komentokehotteessa (gdb).

Command

Kuvaus

run

Aloita ohjelman suoritus

quit

Lopeta gdb

print expr

Tulosta lauseke, jossa lause voi olla myös muuttujan nimi

next

Siirry seuraavalle riville

step

Siirry seuraavalle riville

continue

Jatka nykyiseltä riviltä ohjelman loppuun tai seuraavaan taukokohtaan

Huomaa ero kahden komennon step ja seuraava välillä. Seuraava-komento ei mene funktion sisään, jos seuraava rivi on funktiokutsu. Kun taas step-komento voi mennä sisätoimintoon ja katsoa, mitä siellä tapahtuu.

Esimerkkiistunto GDB:n kanssa

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 virheenkorjausta varten meidän on käännettävä se -g-vaihtoehdolla gcc:ksi seuraavasti.

gcc -g sum.c -o sum

Tulostiedosto sum voidaan liittää gdb:hen jommallakummalla seuraavista tavoista:

1. Määrittämällä tulostiedosto argumentiksi gdb:lle.

gdb sum

2. Suorita tulostiedosto gdb:ssä file-komennolla.

gdb
(gdb) file sum

list-komento luettelee lähdekooditiedoston rivit ja siirtää osoitinta. Joten ensimmäinen luettelo näyttää ensimmäiset 10 riviä ja seuraava luettelo näyttää seuraavat 10 riviä 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 suorittaminen antamalla run -komento. Nyt ohjelma suoritetaan normaalisti. Mutta unohdimme laittaa joitakin keskeytyskohtia lähdekoodiin virheenkorjausta varten, eikö niin? Nämä keskeytyskohdat voidaan määrittää funktioille tai määritetyille riveille.

(gdb) b main

Huomaa: Olen käyttänyt lyhennettä b ilmaisulle break.

Päätoiminnon taukopisteen asettamisen jälkeen ohjelman uudelleenajo pysähtyy riville 11. Sama voidaan tehdä, jos rivinumero on tiedossa.

(gdb) b sum.c:11

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

(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 ne yhdessä run-komennon kanssa.

(gdb) run   . . .

Nykyiseen käynnissä olevaan ohjelmaan liittyvät jaetut kirjastotiedostot voidaan luetteloida 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

Muuttujien muokkaaminen

GDB pystyy myös muokkaamaan muuttujia ohjelman suorittamisen aikana. Kokeillaan tätä. Kuten edellä mainittiin, aseta taukopiste 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 pitäisi olla z=3. Mutta tässä muutimme lopputuloksen arvoon z=4 pääfunktiossa. Tällä tavalla virheenkorjausta voidaan helpottaa käyttämällä gdb:tä.

Ota keskeytyspisteet käyttöön/poista käytöstä

Saat luettelon kaikista keskeytyspisteistä 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 taukopiste ja se on To. käytössä poista keskeytyskohdat käytöstä määritä keskeytyskohdan numero yhdessä disable-komennon kanssa. Ota käyttöön myöhemmin enable-komennolla.

(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 keskeytyskohdat delete-komennolla.

Käynnissä olevien prosessien virheenkorjaus

Lukuisia prosesseja on käynnissä taustalla GNU/Linux-järjestelmässä. Käynnissä olevan prosessin virheenkorjausta varten meidän on ensin löydettävä kyseisen prosessin prosessitunnus. pidof -komento antaa sinulle prosessin pid:n.

pidof <process_name>

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

1. Määrittämällä pid yhdessä gdb:n kanssa.

gdb -p <pid>

2. Käytä gdb:n attach-komentoa.

(gdb) attach <pid>

Tässä kaikki tältä erää. Nämä ovat vain gdb:n perusteita lähdekoodin virheenkorjauksen aloittamiseksi, ja se on paljon enemmän kuin yllä selitetyt asiat. Voimme esimerkiksi tehdä virheenkorjauksen käyttämällä pinon tietoja, ympäristömuuttujia ja paljon muuta. Yritä leikkiä näillä kaikella...