GNU Debugger eller GDB: Et kraftig kildekodefeilsøkingsverktøy for Linux-programmer


En debugger spiller en viktig rolle i ethvert programvareutviklingssystem. Ingen kan skrive en feilfri kode på en gang. I løpet av utviklingen oppstår det feil som må løses for ytterligere forbedring. Et utviklingssystem er ufullstendig uten en debugger. Med tanke på åpen kildekode-utviklerfellesskapet, er GNU Debugger deres beste valg. Den brukes også til kommersiell programvareutvikling på UNIX-plattformer.

GNU Debugger, også kjent som gdb, lar oss snike gjennom koden mens den kjøres eller hva et program prøvde å gjøre i øyeblikket før det krasjet. GDB hjelper oss i utgangspunktet å gjøre fire hovedting for å fange opp feil i kildekoden.

  1. Start programmet, spesifiser argumenter som kan påvirke den generelle oppførselen.
  2. Stopp programmet på angitte betingelser.
  3. Undersøk krasjen eller når programmet ble stoppet.
  4. Endre koden og eksperimentere med den modifiserte koden umiddelbart.

Vi kan bruke gdb til å feilsøke programmer skrevet i C og C++ uten store anstrengelser. Per nå er støtte for andre programmeringsspråk som D, Modula-2, Fortran delvis.

Komme i gang med GNU Debugger eller GDB

GDB påkalles ved hjelp av kommandoen gdb. Når du utsteder gdb, viser den litt informasjon om plattformen og sender deg inn i (gdb) ledeteksten som vist nedenfor .

[root@fedora20 ~]# gdb
Eksempelutgang
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)

Skriv inn hjelp liste for å se de forskjellige klassene av kommandoer som er tilgjengelige i gdb. Skriv help etterfulgt av et klassenavn for en liste over kommandoer i den klassen. Skriv help all for listen over alle kommandoer. Kommandonavnforkortelser er tillatt hvis de er entydige. Du kan for eksempel skrive n i stedet for å skrive neste eller c for fortsett og så videre.

Mest brukte GDB-kommandoer

Vanlige gdb-kommandoer er oppført i tabellen nedenfor. Disse kommandoene skal brukes fra gdb-kommandoprompten (gdb).

Command

Beskrivelse

run

Start en programkjøring

quit

Avslutt gdb

print expr

Skriv ut uttrykk der expr også kan være et variabelnavn

next

Gå til neste linje

step

Gå inn i neste linje

continue

Fortsett fra gjeldende linje til slutten av programmet eller neste pausepunkt

Legg merke til forskjellen mellom de to kommandoene trinn og neste. Kommandoen neste går ikke inn i funksjonen hvis neste linje er et funksjonskall. Mens trinn kommando kan gå inn i funksjonen og se hva som skjer der.

En prøveøkt med GDB

Tenk på følgende kildekode.


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

For å feilsøke utdatafilen må vi kompilere den samme med -g-alternativet til gcc som følger.

gcc -g sum.c -o sum

Utdatafilen sum kan legges til gdb via en av følgende 2 måter:

1. Ved å spesifisere utdatafilen som et argument til gdb.

gdb sum

2. Kjøre utdatafilen inne i gdb ved hjelp av kommandoen fil.

gdb
(gdb) file sum

Kommandoen list viser linjer i kildekodefilen og flytter pekeren. Så første liste vil vise de første 10 linjene og neste liste viser de neste 10 og så videre.

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

For å starte kjøringen, utfør kjør kommandoen. Nå kjøres programmet normalt. Men vi glemte å sette noen bruddpunkter i kildekoden for feilsøking, ikke sant? Disse bruddpunktene kan spesifiseres for funksjoner eller ved spesifiserte linjer.

(gdb) b main

Merk: Jeg har brukt en forkortelse b for pause.

Etter innstilling av bruddpunkt ved hovedfunksjon, vil gjenkjøring av programmet stoppe på linje 11. Det samme kan gjøres hvis linjenummeret er kjent fra før.

(gdb) b sum.c:11

Gå nå gjennom kodelinjene ved å bruke kommandoen neste eller n. Det er viktig å merke seg at kommandoen neste ikke går inn i funksjonskoden med mindre et bruddpunkt er satt på funksjonen. La oss prøve kommandoen print nå. Sett bruddpunkt på funksjonssum som nedenfor.

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

Hvis programmet som kjøres krever kommandolinjeparametere, oppgi det samme sammen med run-kommandoen som.

(gdb) run   . . .

Delte bibliotekfiler knyttet til det gjeldende programmet som kjører, kan vises som.

(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

Endre variabler

GDB er også i stand til å modifisere variabler under gjennomføringen av programmet. La oss prøve dette. Som nevnt ovenfor, sett bruddpunktet på linje 16 og kjør programmet.

(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

a=1, b=2 og resultatet skal være z=3. Men her endret vi sluttresultatet tilz=4 i hovedfunksjonen. På denne måten kan feilsøking gjøres enklere ved å bruke gdb.

Aktiver/deaktiver bruddpunkter

For å få listen over alle bruddpunkter, skriv inn info bruddpunkter.

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

Her er det bare ett knekkpunkt og det er Til. aktivert deaktiver bruddpunktene spesifiser bruddpunktnummeret sammen med kommandoen deaktiver. For å aktivere etterpå, bruk aktiver-kommandoen.

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

Du kan også slette bruddpunktene med kommandoen slett.

Debugging kjørende prosesser

Tallrike prosesser kjører i bakgrunnen i et GNU/Linux-system. For å feilsøke en kjørende prosess må vi først og fremst finne prosess-ID-en til den aktuelle prosessen. pidof kommandoen gir deg pid av en prosess.

pidof <process_name>

Nå må vi knytte denne piden til gdb. Det er 2 måter.

1. Ved å spesifisere pid sammen med gdb.

gdb -p <pid>

2. Bruk kommandoen attach fra gdb.

(gdb) attach <pid>

Det er alt for nå. Dette er bare grunnleggende om gdb for å få en god start i feilsøking av kildekode, og det er mye mer enn tingene som er forklart ovenfor. For eksempel kan vi feilsøke ved å bruke stabelinformasjonen, miljøvariabler og mye mer. Prøv å leke med alle disse tingene...