GNU Debugger jew GDB: Għodda Qawwija tad-Debugging tal-Kodiċi Sors għall-Programmi Linux


Debugger għandu rwol vitali fi kwalunkwe sistema ta 'żvilupp ta' softwer. Ħadd ma jista 'jikteb kodiċi mingħajr bug kollha f'daqqa. Matul il-kors tal-iżvilupp, bugs qed jitqajmu u jeħtieġ li jiġu solvuti għal aktar titjib. Sistema ta 'żvilupp mhix kompluta mingħajr debugger. Meta wieħed iqis il-komunità tal-iżviluppaturi tas-sors miftuħ, GNU Debugger huwa l-aħjar għażla tagħhom. Jintuża wkoll għall-iżvilupp ta 'softwer kummerċjali fuq pjattaformi tat-tip UNIX.

GNU Debugger, magħruf ukoll bħala gdb, jippermettilna ngħaddu mill-kodiċi waqt li jesegwixxi jew dak li programm kien qed jipprova jagħmel fil-mument qabel ma ġġarraf. GDB bażikament jgħinna nagħmlu erba 'affarijiet ewlenin biex naqbdu d-difetti fil-kodiċi tas-sors.

  1. Ibda l-programm, billi tispeċifika argumenti li jistgħu jaffettwaw l-imġieba ġenerali.
  2. Waqqaf il-programm fuq kundizzjonijiet speċifikati.
  3. Eżamina l-ħabta jew meta twaqqaf il-programm.
  4. Ibdel il-kodiċi u biex tesperimenta bil-kodiċi modifikat istantanjament.

Nistgħu nużaw gdb biex niddibaggjaw programmi miktuba f'C u C++ mingħajr ħafna sforz. Minn issa l-appoġġ għal lingwi ta 'programmar oħra bħal D, Modula-2, Fortran huma parzjali.

Nibdew b'GNU Debugger jew GDB

GDB jiġi invokat bl-użu tal-kmand gdb. Mal-ħruġ ta' gdb, juri xi informazzjoni dwar il-pjattaforma u jpoġġik fil-pront (gdb) kif muri hawn taħt.

 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)

Ittajpja help lista biex toħroġ il-klassijiet differenti ta' kmandi disponibbli ġewwa gdb. Ittajpja help segwit minn isem ta' klassi għal lista ta' kmandi f'dik il-klassi. Ittajpja help all għal-lista tal-kmandi kollha. L-abbrevjazzjonijiet tal-ismijiet tal-kmand huma permessi jekk ma jkunux ambigwi. Pereżempju, tista' tikteb n minflok ma ttajpja li jmiss jew ċ għal kompli eċċ.

Kmandi gdb użati b'mod komuni huma elenkati fit-tabella li ġejja. Dawn il-kmandi għandhom jintużaw mill-prompt tal-kmand gdb (gdb).

Innota d-differenza bejn iż-żewġ kmandi pass u li jmiss. Il-kmand li jmiss ma jidħolx ġewwa l-funzjoni jekk il-linja li jmiss hija sejħa tal-funzjoni. Billi l-kmand tal-pass jista’ jidħol fil-funzjoni ta’ ġewwa u jara x’jiġri hemmhekk.

Ikkunsidra l-kodiċi tas-sors li ġej.

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

Sabiex tiddibaggja l-fajl tal-produzzjoni għandna bżonn niġbru l-istess b'-g għażla għal gcc kif ġej.

$ gcc -g sum.c -o sum

Il-fajl tal-output somma jista’ jiġi mehmuż ma’ gdb permezz ta’ wieħed minn dawn iż-żewġ modi:

1. Billi tispeċifika l-fajl tal-output bħala argument għal gdb.

$ gdb sum

2. Running output file ġewwa gdb bl-użu ta 'file kmand.

$ gdb
(gdb) file sum

Il-kmand tal-lista jelenka linji fil-fajl tal-kodiċi tas-sors u jċaqlaq il-pointer. Allura l-ewwel lista se turi l-ewwel 10 linji u l-lista li jmiss turi l-10 li jmiss u l-bqija.

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

Biex tibda l-eżekuzzjoni, toħroġ il-kmand run. Issa l-programm jitwettaq normalment. Imma insew li npoġġu xi breakpoints fil-kodiċi tas-sors għad-debugging, hux? Dawn il-punti ta' waqfien jistgħu jiġu speċifikati għal funzjonijiet jew f'linji speċifikati.

(gdb) b main

Nota: Jien użajt abbrevjazzjoni b għall-waqfa.

Wara li tissettja l-punt ta 'waqfien fil-funzjoni prinċipali, it-tmexxija mill-ġdid tal-programm tieqaf fil-linja 11. L-istess ħaġa tista' ssir fis-seħħ jekk in-numru tal-linja jkun magħruf qabel.

(gdb) b sum.c:11

Issa pass mil-linji tal-kodiċi billi tuża l-kmand li jmiss jew n. Huwa importanti li wieħed jinnota li l-kmand li jmiss ma jidħolx fil-kodiċi tal-funzjoni sakemm ma jkunx stabbilit punt ta 'waqfien fuq il-funzjoni. Ejja nippruvaw il-kmand print issa. Issettja l-punt ta 'waqfien fuq is-somma tal-funzjoni kif hawn taħt.

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

Jekk il-programm li qed jitmexxa jeħtieġ parametri tal-linja tal-kmand imbagħad ipprovdi l-istess flimkien mal-kmand run bħala.

(gdb) run   . . .

Fajls tal-librerija maqsuma assoċjati mal-programm kurrenti li qed jaħdem jistgħu jiġu elenkati bħala.

(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 huwa kapaċi wkoll li jimmodifika varjabbli matul l-eżekuzzjoni tal-programm. Ejja nippruvaw dan. Kif imsemmi hawn fuq stabbilixxa break point fil-linja 16 u mexxi l-programm.

(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

Issa a = 1, b = 2 u r-riżultat għandu jkun z = 3. Imma hawnhekk biddilna r-riżultat finali għal z = 4 fil-funzjoni prinċipali. B'dan il-mod id-debugging jista' jsir aktar faċli bl-użu ta' gdb.

Biex tikseb il-lista tal-punti ta' waqfien kollha ittajpja punti ta' waqfien tal-informazzjoni.

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

Hawnhekk hemm break point wieħed biss u huwa To. ppermettiet tiddiżattiva l-punti ta 'waqfien speċifika n-numru tal-punt ta' waqfien flimkien mal-kmand disable. Biex tippermetti wara uża l-kmand enable.

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

Tista 'wkoll tħassar il-punti ta' waqfien bil-kmand ħassar.

Bosta proċessi qed jaħdmu fl-isfond f'sistema GNU/Linux. Biex tiddibaggja proċess li qed jaħdem l-ewwelnett irridu nsibu l-id tal-proċess ta 'dak il-proċess partikolari. pidof kmand jagħtik il-pid ta 'proċess.

$ pidof <process_name>

Issa rridu nehmeż dan il-pid mal-gdb. Hemm 2 modi.

1. Billi tispeċifika pid flimkien ma 'gdb.

$ gdb -p <pid>

2. Bl-użu ta 'ehmeż kmand minn gdb.

(gdb) attach <pid>

Dak kollu għalissa. Dawn huma biss bażiċi ta 'gdb biex tibda tajjeb fil-kodiċi tas-sors tad-debugging u hija ħafna aktar mill-affarijiet spjegati hawn fuq. Per eżempju, nistgħu niddebug billi tuża l-informazzjoni tal-munzell, il-varjabbli ambjentali u ħafna aktar. Ipprova tilgħab ma' dawn l-affarijiet kollha...