GNU Debugger eller GDB: Et kraftfuldt kildekode-fejlretningsværktøj til Linux-programmer


En debugger spiller en vigtig rolle i ethvert softwareudviklingssystem. Ingen kan skrive en fejlfri kode på én gang. I løbet af udviklingen hæves bugs og skal løses for yderligere forbedring. Et udviklingssystem er ufuldstændigt uden en debugger. I betragtning af open source-udviklerfællesskabet er GNU Debugger deres bedste valg. Det bruges også til kommerciel softwareudvikling på UNIX-platforme.

GNU Debugger, også kendt som gdb, giver os mulighed for at snige sig gennem koden, mens den udføres, eller hvad et program forsøgte at gøre i øjeblikket, før det styrtede ned. GDB hjælper os grundlæggende med at gøre fire hoved ting for at afhjælpe mangler i kildekoden.

  1. Start programmet og angiv argumenter, der kan påvirke den generelle adfærd.
  2. Stop programmet under angivne betingelser.
  3. Undersøg nedbruddet, eller når programmet blev stoppet.
  4. Skift koden og eksperimentere med den ændrede kode med det samme.

Vi kan bruge gdb til at debugge programmer skrevet i C og C ++ uden megen anstrengelse. Fra nu af er understøttelse af andre programmeringssprog som D, Modula-2, Fortran delvis.

Kom godt i gang med GNU Debugger eller GDB

GDB påkaldes ved hjælp af kommandoen gdb . Ved udstedelse af gdb viser den nogle oplysninger om platform og slipper dig ind i ( gdb ) -prompten som vist nedenfor.

 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)

Skriv hjælp liste for at få vist de forskellige klasser af kommandoer, der er tilgængelige i gdb. Skriv hjælp efterfulgt af et klassenavn for en liste over kommandoer i den pågældende klasse. Skriv hjælp alle for listen over alle kommandoer. Kommandonavnets forkortelser er tilladt, hvis de er entydige. For eksempel kan du skrive n i stedet for at skrive næste eller c for fortsæt og så videre.

Almindeligt anvendte gdb-kommandoer er angivet i følgende tabel. Disse kommandoer skal bruges fra gdb-kommandoprompten ( gdb ).

Bemærk forskellen mellem de to kommandoer trin og næste . Den næste kommando går ikke ind i funktionen, hvis næste linje er et funktionsopkald. Mens kommandoen trin kan gå ind i funktion og se, hvad der sker der.

Overvej 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 at fejle outputfilen skal vi kompilere det samme med -g mulighed for at gcc som følger.

$ gcc -g sum.c -o sum

Outputtfilen sum kan vedhæftes til gdb via en af følgende to måder:

1. Ved at specificere outputfilen som et argument til gdb.

$ gdb sum

2. Kørsel af outputfil inde i gdb ved hjælp af kommandoen file .

$ gdb
(gdb) file sum

Kommandoen liste viser linjer i kildekodefilen og flytter markøren. Så først liste viser de første 10 linjer, og næste liste viser de næste 10 osv.

(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 at starte udførelse skal du udstede kommandoen run . Nu bliver programmet udført normalt. Men vi glemte at sætte nogle breakpoints i kildekoden til debugging, ikke? Disse breakpoints kan specificeres for funktioner eller på bestemte linjer.

(gdb) b main

Bemærk: Jeg har brugt en forkortelse b til pause.

Efter indstilling af brudpunkt ved hovedfunktion stopper genkørsel af programmet ved linje 11. Det samme kan gennemføres, hvis linjenummeret er kendt før.

(gdb) b sum.c:11

Gå nu gennem kodelinjerne ved hjælp af kommandoen næste eller n . Det er vigtigt at bemærke, at kommandoen næste ikke går ind i funktionskoden, medmindre der er angivet et brudpunkt på funktionen. Lad os prøve kommandoen print nu. Indstil brudpunkt på funktionssummen 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 det program, der køres, kræver kommandolinjeparametre, skal du give det samme sammen med kommandoen run som.

(gdb) run   . . .

Delt biblioteksfiler tilknyttet det aktuelle kørende program 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

GDB er også i stand til at ændre variabler under hele udførelsen af programmet. Lad os prøve det. Som nævnt ovenfor skal du indstille brydepunktet ved linje 16 og køre 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

Nu skal a = 1, b = 2 og resultatet være z = 3. Men her ændrede vi det endelige resultat til z = 4 i hovedfunktionen. På denne måde kan debugging gøres lettere ved hjælp af gdb.

For at få listen over alle breakpoints skal du skrive info breakpoints .

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

Her er der kun et brudpunkt, og det er To. deaktiver deaktiver pausepunkterne specificer pausepunktsnummeret sammen med kommandoen deaktiver . For at aktivere bagefter skal du bruge kommandoen aktiver .

(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 breakpoints med slet kommandoen.

Talrige processer kører i baggrunden i et GNU/Linux-system. For at fejle en kørende proces skal vi først og fremmest finde proces-id'et for den pågældende proces. pidof kommandoen giver dig pid for en proces.

$ pidof <process_name>

Nu skal vi vedhæfte denne pid til gdb. Der er to måder.

1. Ved at specificere pid sammen med gdb.

$ gdb -p <pid>

2. Brug kommandoen vedhæft fra gdb.

(gdb) attach <pid>

Det er alt for nu. Dette er kun det grundlæggende i gdb for at få en god start i debugging af kildekode, og det er meget mere end de ting, der er forklaret ovenfor. For eksempel kan vi debugge ved hjælp af stakoplysninger, miljøvariabler og meget mere. Prøv at lege med alle disse ting ...