GNU Debugger ko GDB: Ƙarfin Ƙarfin Ƙaƙwalwar Code na Kayan aiki don Shirye-shiryen Linux


Mai gyara kuskure yana taka muhimmiyar rawa a kowane tsarin haɓaka software. Babu wanda zai iya rubuta lambar mara amfani a lokaci guda. A lokacin ci gaba, ana tada kwari kuma ana buƙatar warwarewa don ƙarin haɓakawa. Tsarin ci gaba bai cika ba tare da debugger ba. La'akari da bude tushen al'umma masu haɓakawa, GNU Debugger shine mafi kyawun zaɓin su. Hakanan ana amfani dashi don haɓaka software na kasuwanci akan dandamali nau'in UNIX.

GNU Debugger, wanda kuma aka sani da gdb, yana ba mu damar shiga cikin lambar yayin da yake aiwatarwa ko abin da shirin ke ƙoƙarin yi a wannan lokacin kafin ya fado. GDB yana taimaka mana mu yi manyan abubuwa huɗu don kama kurakurai a cikin lambar tushe.

  1. Fara shirin, ƙayyadaddun hujjoji waɗanda za su iya shafar ɗabi'a na gaba ɗaya.
  2. Dakatar da shirin akan takamaiman sharuɗɗan.
  3. Duba hadarin ko lokacin da aka dakatar da shirin.
  4. Canja lambar kuma don gwada lambar da aka gyara nan take.

Za mu iya amfani da gdb don gyara shirye-shiryen da aka rubuta a C da C++ ba tare da ƙoƙarce-ƙoƙarce ba. Har zuwa yanzu tallafi ga wasu yarukan shirye-shirye kamar D, Modula-2, Fortran sun kasance bangare ne.

Farawa tare da GNU Debugger ko GDB

Ana kiran GDB ta amfani da umarnin gdb. A kan fitar da gdb, yana nuna wasu bayanai game da dandamali kuma ya jefa ku cikin hanzarin (gdb) kamar yadda aka nuna a ƙasa.

 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)

Buga jerin taimako don fitar da nau'ikan umarni daban-daban da ke cikin gdb. Buga taimako sannan sunan aji don jerin umarni a wannan ajin. Buga taimako duka don jerin duk umarni. Ana ba da izinin gajarta sunan umarni idan babu shakka. Misali, zaku iya rubuta n maimakon buga na gaba ko c don ci gaba da sauransu.

An jera umarnin gdb da aka saba amfani da su a cikin tebur mai zuwa. Za a yi amfani da waɗannan umarni daga saƙon umarni na gdb (gdb).

Ka lura da bambanci tsakanin umarni biyu mataki da na gaba. Umurni na gaba baya shiga cikin aiki idan layi na gaba shine kiran aiki. Ganin cewa mataki umarni na iya shiga cikin aiki don ganin abin da ke faruwa a can.

Yi la'akari da lambar tushe mai zuwa.

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

Domin gyara fayil ɗin fitarwa muna buƙatar tara iri ɗaya tare da zaɓin -g zuwa gcc kamar haka.

$ gcc -g sum.c -o sum

Ana iya haɗa fayil ɗin fitarwasum zuwa gdb ta ɗayan hanyoyi biyu masu zuwa:

1. Ta hanyar tantance fayil ɗin fitarwa azaman hujja zuwa gdb.

$ gdb sum

2. Gudun fitarwa fayil a cikin gdb ta amfani da fayilumarni.

$ gdb
(gdb) file sum

Umurnin jeri yana lissafin layi a cikin fayil ɗin lambar tushe kuma yana motsa mai nuni. Don haka na farko jerizai nuna layi na 10 na farko sannan jerina gaba zai nuna 10 na gaba da sauransu.

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

Don fara aiwatarwa, ba da umarnin run. Yanzu ana aiwatar da shirin kamar yadda aka saba. Amma mun manta da sanya wasu wuraren karyawa a cikin lambar tushe don gyara kuskure, daidai? Ana iya ƙididdige waɗannan wuraren karya don ayyuka ko a ƙayyadadden layi.

(gdb) b main

Lura: Na yi amfani da gajarta b don hutu.

Bayan saita wurin hutu a babban aiki, sake kunna shirin zai tsaya a layi na 11. Hakanan za'a iya yin aiki iri ɗaya idan an san lambar layin a baya.

(gdb) b sum.c:11

Yanzu shiga cikin layin code ta amfani da umarnin na gaba ko n. Yana da mahimmanci a lura cewa na gabaumarni baya shiga cikin lambar aiki sai dai idan an saita wurin hutu akan aikin. Bari mu gwada umarnin print yanzu. Saita hutu akan jimlar aiki kamar ƙasa.

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

Idan shirin da ake gudanar yana buƙatar sigogin layin umarni sannan samar da guda ɗaya tare da umarnin runa matsayin.

(gdb) run   . . .

Fayilolin ɗakin karatu da aka raba masu alaƙa da shirin mai gudana na yanzu ana iya jera su azaman.

(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 kuma yana da ikon canza masu canji a duk lokacin aiwatar da shirin. Bari mu gwada wannan. Kamar yadda aka ambata a sama saita wurin hutu a layi na 16 kuma gudanar da shirin.

(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

Yanzu a = 1, b = 2 kuma sakamakon ya kamata ya zama z = 3. Amma a nan mun canza sakamakon ƙarshe zuwa z = 4 a cikin babban aikin. Ta wannan hanyar za'a iya sauƙaƙe gyara kuskure ta amfani da gdb.

Don samun jerin duk wuraren karya buga maganganun bayanai.

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

Anan akwai wurin hutu ɗaya kawai kuma shine To. kunna kashe wuraren hutu suna saka lambar hutu tare da umarnin sake. Don kunna bayan haka yi amfani da umarnin enable.

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

Hakanan zaka iya share wuraren karya tare da umarnin share.

Yawancin matakai suna gudana a bango a cikin tsarin GNU/Linux. Don cire tsarin da ke gudana da farko muna buƙatar nemo id ɗin tsari na wannan tsari na musamman. Umurnin pidof yana ba ku pid na tsari.

$ pidof <process_name>

Yanzu muna buƙatar haɗa wannan pid zuwa gdb. Akwai hanyoyi guda 2.

1. Ta hanyar tantance pid tare da gdb.

$ gdb -p <pid>

2. Amfani da haɗe umarni daga gdb.

(gdb) attach <pid>

Shi ke nan a yanzu. Waɗannan su ne kawai kayan yau da kullun na gdb don samun kyakkyawan farawa a cikin lalata lambar tushe kuma ya fi abubuwan da aka bayyana a sama. Misali, za mu iya cire kuskure ta amfani da bayanan tari, masu canjin yanayi da ƙari mai yawa. Yi ƙoƙarin yin wasa da duk waɗannan abubuwan…