GNU düzediji ýa-da GDB: Linux programmalary üçin güýçli çeşme koduny düzetmek guraly


Düzediji islendik programma üpjünçiligini ösdürmek ulgamynda möhüm rol oýnaýar. Hiç kim birbada kemçiliksiz kod ýazyp bilmez. Ösüşiň dowamynda kemçilikler köpelýär we hasam güýçlendirmek üçin çözülmeli. Ösüş ulgamy düzedişsiz doly däl. Açyk çeşme döredijiler jemgyýetini göz öňünde tutsak, GNU çözüji olaryň iň gowy saýlawydyr. Şeýle hem, UNIX görnüşli platformalarda täjirçilik programma üpjünçiligini ösdürmek üçin ulanylýar.

GNb çözüji, gdb ady bilen hem tanalýar, ýerine ýetirilýän wagty ýa-da bir programma ýykylmanka näme etjek bolýan bolsa, koddan sypmaga mümkinçilik berýär. GDB, esasan, deslapky koddaky kemçilikleri tapmak üçin dört esasy işi etmäge kömek edýär.

  1. Umumy özüni alyp barşyna täsir edip biljek argumentleri görkezip, programmany başlaň.
  2. Programmany görkezilen şertlerde bes ediň.
  3. heläkçiligi ýa-da programma togtadylanda gözden geçiriň.
  4. Kody üýtgediň we üýtgedilen kody derrew synagdan geçiriň.

Gdb-ni C we C ++ bilen ýazylan programmalary düzetmek üçin ulanyp bileris. Häzirki wagtda D, Modula-2, Fortran ýaly beýleki programmirleme dilleri üçin goldaw bölekleýin.

GNU çözüji ýa-da GDB bilen başlamak

GDB gdb buýrugy bilen ulanylýar. gdb berlende, platforma barada käbir maglumatlary görkezýär we aşakda görkezilişi ýaly sizi ( gdb ) soramaga iberýär.

 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)

Gdb-de bar bolan buýruklaryň dürli synplaryny görkezmek üçin kömek sanawyny ýazyň. Şol synpdaky buýruklaryň sanawy üçin kömek ýazyň. Commandshli buýruklaryň sanawy üçin kömek ediň ýazyň. Buýruk adynyň gysgaltmalary birmeňzeş bolsa, rugsat berilýär. Mysal üçin, dowamy üçin indiki ýa-da c ýazmagyň ýerine n ýazyp bilersiňiz.

Köplenç ulanylýan gdb buýruklary aşakdaky tablisada görkezilýär. Bu buýruklar gdb buýruk buýrugyndan ( gdb ) ulanylmaly.

Iki ädim ädim we indiki arasyndaky tapawuda üns beriň. Indiki buýruk funksiýa jaňy bolsa, indiki buýruk içerki funksiýa girmeýär. ädim buýrugy içerki funksiýa girip, ol ýerde nämeleriň bolup biljekdigini görüp biler.

Aşakdaky deslapky kody gözden geçiriň.

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

Çykyş faýlyny düzetmek üçin gg opsiýasy bilen gcc-i aşakdaky ýaly düzmeli.

$ gcc -g sum.c -o sum

Çykyş faýly jem aşakdaky 2 usulyň ikisiniň üsti bilen gdb-e birikdirilip bilner:

1. Çykyş faýlyny gdb-ä argument hökmünde görkezmek bilen.

$ gdb sum

2. faýl buýrugyny ulanyp, gdb-de çykyş faýlyny işletmek.

$ gdb
(gdb) file sum

sanaw buýrugy deslapky kod faýlyndaky setirleri görkezýär we görkezijini herekete getirýär. Şonuň üçin ilkinji sanaw ilkinji 10 setiri görkezer we indiki sanaw indiki 10 we ş.m. görkezer.

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

Executionerine ýetirmek üçin buýrugyny beriň. Indi programma adaty ýerine ýetirilýär. Emma düzediş üçin deslapky koda käbir bölekleri goýmagy ýatdan çykardyk, şeýlemi? Bu bölekler funksiýalar ýa-da kesgitlenen setirlerde kesgitlenip bilner.

(gdb) b main

Bellik: Arakesme üçin b gysgaltmasyny ulandym.

Esasy funksiýada arakesme bellänsoň, programmany täzeden işletmek 11-nji setirde durar. Şol bir zat, setir belgisi öň belli bolsa, güýje girip biler.

(gdb) b sum.c:11

Indi indiki ýa-da n buýrugyny ulanyp kod setirlerinden geçiň. Funksiýada arakesme nokady goýulmasa indiki buýrugynyň funksiýa kody girmeýändigini bellemelidiris. Geliň, indi çap etmek buýrugyny synap göreliň. Aşakdaky ýaly funksiýanyň jemine arakesme belläň.

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

Işleýän programma buýruk setiriniň parametrlerini talap edýän bolsa, run buýrugy bilen bilelikde üpjün ediň.

(gdb) run   . . .

Häzirki işleýän programma bilen baglanyşykly umumy kitaphananyň faýllary sanawda görkezilip bilner.

(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 programmanyň ýerine ýetirilişinde üýtgeýänleri hem üýtgetmäge ukyply. Geliň muny synap göreliň. Aboveokarda aýdylyşy ýaly 16-njy setirde arakesme belläň we programmany işlediň.

(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

Indi a=1, b=2 we netije z=3 bolmaly. Hereöne bu ýerde esasy funksiýada iň soňky netijäni z=4 diýip üýtgetdik. Şeýlelik bilen, gdb ulanyp düzeltmek aňsatlaşdyrylyp bilner.

Breakhli nokatlaryň sanawyny almak üçin maglumat nokatlary ýazyň.

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

Bu ýerde diňe bir arakesme bar we ol. açyk nokatlary öçürmek mümkinçiligini öçürmek buýrugy bilen birlikde nokat belgisini görkeziň. Ondan soň işletmek üçin mümkinçilik buýrugyny ulanyň.

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

Şeýle hem, pozmak buýrugy bilen aralyk nokatlaryny pozup bilersiňiz.

GNU/Linux ulgamynda köp sanly proses işleýär. Işleýän prosesi düzetmek üçin ilki bilen şol aýratyn prosesiň idini tapmaly. pidof buýrugy size prosesiň pidini berýär.

$ pidof <process_name>

Indi bu pidi gdb-e dakmaly. 2 ýol bar.

1. Gdb bilen bilelikde pid görkezmek bilen.

$ gdb -p <pid>

2. gdb-den goşmak buýrugyny ulanmak.

(gdb) attach <pid>

Bularyň hemmesi häzirlikçe. Bular diňe kod koduny düzetmekde gowy başlamak üçin gdb-iň esaslary we ýokarda düşündirilenlerden has kän. Mysal üçin, stack maglumatlary, daşky gurşaw üýtgeýjileri we başga-da köp zatlary ulanyp düzedip bileris. Bu zatlaryň hemmesi bilen oýnamaga synanyşyň ...