Kitatuzi cha GNU au GDB: Chombo chenye Nguvu cha Utatuzi cha Msimbo wa Chanzo kwa Programu za Linux


Kitatuzi kina jukumu muhimu katika mfumo wowote wa ukuzaji wa programu. Hakuna mtu anayeweza kuandika msimbo usio na hitilafu kwa wakati mmoja. Wakati wa maendeleo, mende hufufuliwa na inahitaji kutatuliwa kwa uboreshaji zaidi. Mfumo wa uendelezaji haujakamilika bila kitatuzi. Kwa kuzingatia jumuiya ya wasanidi programu huria, Kitatuzi cha GNU ni chaguo lao bora zaidi. Inatumika pia kwa ukuzaji wa programu za kibiashara kwenye majukwaa ya aina ya UNIX.

Kitatuzi cha GNU, pia kinachojulikana kama gdb, huturuhusu kupitia msimbo wakati inatekeleza au kile ambacho programu ilikuwa ikijaribu kufanya wakati huo kabla haijaharibika. GDB kimsingi hutusaidia kufanya mambo makuu manne ili kupata dosari katika msimbo wa chanzo.

  1. Anzisha programu, ukibainisha hoja zinazoweza kuathiri tabia ya jumla.
  2. Sitisha programu kwa masharti maalum.
  3. Chunguza hitilafu au wakati programu ilisimamishwa.
  4. Badilisha msimbo na ujaribu kutumia msimbo uliorekebishwa mara moja.

Tunaweza kutumia gdb kutatua programu zilizoandikwa katika C na C++ bila juhudi nyingi. Kufikia sasa msaada wa lugha zingine za programu kama D, Modula-2, Fortran ni sehemu.

Kuanza na Kitatuzi cha GNU au GDB

GDB inaombwa kwa kutumia gdb amri. Unapotoa gdb, huonyesha baadhi ya taarifa kuhusu mfumo na kukuleta kwenye kidokezo cha (gdb) kama inavyoonyeshwa hapa chini.

 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)

Andika help orodha ili kutoa aina tofauti za amri zinazopatikana ndani ya gdb. Andika msaada ikifuatiwa na jina la darasa kwa orodha ya amri katika darasa hilo. Andika saidia zote kwa orodha ya amri zote. Vifupisho vya jina la amri vinaruhusiwa ikiwa ni wazi. Kwa mfano, unaweza kuandika n badala ya kuandika ijayo au c kwa endelea na kadhalika.

Amri za gdb zinazotumiwa kawaida zimeorodheshwa kwenye jedwali lifuatalo. Amri hizi zitatumika kutoka kwa amri ya gdb (gdb).

Kumbuka tofauti kati ya amri mbili step na ijayo. Amri inayofuata haiendi ndani ya utendaji ikiwa mstari unaofuata ni simu ya kukokotoa. Ambapo step amri inaweza kuingia katika utendaji kazi na kuona kitakachotokea hapo.

Fikiria msimbo wa chanzo ufuatao.

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

Ili kutatua faili ya towe tunahitaji kukusanya sawa na -g chaguo kwa gcc kama ifuatavyo.

$ gcc -g sum.c -o sum

Faili ya pato sum inaweza kuambatishwa kwa gdb kupitia mojawapo ya njia 2 zifuatazo:

1. Kwa kubainisha faili ya towe kama hoja kwa gdb.

$ gdb sum

2. Kuendesha faili towe ndani ya gdb kwa kutumia faili amri.

$ gdb
(gdb) file sum

Amri ya orodha huorodhesha mistari katika faili ya msimbo wa chanzo na kuhamisha pointer. Kwa hivyo orodha ya kwanza itaonyesha mistari 10 ya kwanza na orodha inayofuata itaonyesha 10 zinazofuata na kadhalika.

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

Ili kuanza kutekeleza, toa amri ya run. Sasa programu inatekelezwa kama kawaida. Lakini tulisahau kuweka vizuizi katika msimbo wa chanzo kwa utatuzi, sivyo? Viingilio hivi vinaweza kubainishwa kwa chaguo za kukokotoa au kwa mistari iliyobainishwa.

(gdb) b main

Kumbuka: Nimetumia kifupi b kwa mapumziko.

Baada ya kuweka hatua ya mapumziko kwenye kazi kuu, kurejesha programu itasimama kwenye mstari wa 11. Kitu kimoja kinaweza kufanywa ikiwa nambari ya mstari inajulikana kabla.

(gdb) b sum.c:11

Sasa pitia mistari ya msimbo kwa kutumia ijayo au n amri. Ni muhimu kutambua kwamba amri ya ijayo haiendi ndani ya msimbo wa utendakazi isipokuwa sehemu ya mapumziko imewekwa kwenye chaguo la kukokotoa. Hebu tujaribu amri ya print sasa. Weka sehemu ya mapumziko kwenye jumla ya kazi kama ilivyo hapo chini.

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

Ikiwa programu inayoendeshwa inahitaji vigezo vya mstari wa amri basi toa sawa pamoja na run amri kama.

(gdb) run   . . .

Faili za maktaba zinazoshirikiwa zinazohusiana na programu inayoendesha sasa zinaweza kuorodheshwa kama.

(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 pia ina uwezo wa kurekebisha vigeu wakati wote wa utekelezaji wa programu. Hebu jaribu hili. Kama ilivyoelezwa hapo juu weka sehemu ya mapumziko kwenye mstari wa 16 na uendesha programu.

(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

Sasa a = 1, b = 2 na matokeo yanapaswa kuwa z = 3. Lakini hapa tulibadilisha matokeo ya mwisho hadi z = 4 katika kazi kuu. Kwa njia hii utatuzi unaweza kurahisishwa kutumia gdb.

Ili kupata orodha ya vizuizi vyote andika vivumbuzi vya habari.

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

Hapa kuna sehemu moja tu ya mapumziko nayo ni Kwa. kuwezeshwa lemaza sehemu za kuvunja bainisha nambari ya sehemu ya kukatika pamoja na amri ya zima. Ili kuwezesha baadaye tumia amri ya wezesha.

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

Unaweza pia kufuta sehemu za kuvunja kwa amri ya futa.

Michakato mingi inaendelea chinichini katika mfumo wa GNU/Linux. Ili kutatua mchakato unaoendesha kwanza kabisa tunahitaji kupata kitambulisho cha mchakato huo. Amri ya pidof inakupa pid ya mchakato.

$ pidof <process_name>

Sasa tunahitaji kuambatisha pid hii kwa gdb. Kuna njia 2.

1. Kwa kubainisha pid pamoja na gdb.

$ gdb -p <pid>

2. Kwa kutumia ambatanisha amri kutoka gdb.

(gdb) attach <pid>

Hayo ni yote kwa sasa. Hizi ni misingi tu ya gdb kupata mwanzo mzuri wa kurekebisha msimbo wa chanzo na ni zaidi ya mambo yaliyoelezewa hapo juu. Kwa mfano, tunaweza kutatua kwa kutumia maelezo ya rafu, anuwai za mazingira na mengi zaidi. Jaribu kucheza na vitu hivi vyote ...