GNU Debugger o GDB: Usa ka Gamhanan nga Source Code Debugging tool para sa Linux Programs


Ang usa ka debugger adunay hinungdanon nga papel sa bisan unsang sistema sa pagpalambo sa software. Walay makasulat ug bug-free nga code sa usa ka higayon. Sa panahon sa pag-uswag, ang mga bug gipataas ug kinahanglan nga sulbaron alang sa dugang nga pagpaayo. Ang usa ka sistema sa pag-uswag dili kompleto kung wala ang usa ka debugger. Sa pagkonsiderar sa open source developers nga komunidad, ang GNU Debugger mao ang ilang pinakamaayong pagpili. Gigamit usab kini alang sa komersyal nga software development sa UNIX type nga mga plataporma.

Ang GNU Debugger, nailhan usab nga gdb, nagtugot kanato sa paglusot sa code samtang kini nag-execute o kung unsa ang gisulayan nga buhaton sa usa ka programa sa wala pa kini nahagsa. Ang GDB sa batakan nagtabang kanato sa pagbuhat sa upat ka panguna nga mga butang aron makuha ang mga sayup sa gigikanan nga code.

  1. Sugdi ang programa, nagpiho sa mga argumento nga mahimong makaapekto sa kinatibuk-ang kinaiya.
  2. Hunonga ang programa sa piho nga mga kondisyon.
  3. Susiha ang pagkahagsa o kanus-a nahunong ang programa.
  4. Ilisan ang kodigo ug mag-eksperimento dayon sa giusab nga kodigo.

Mahimo natong gamiton ang gdb sa pag-debug sa mga programa nga gisulat sa C ug C++ nga walay daghang paningkamot. Sa pagkakaron ang suporta alang sa ubang mga programming language sama sa D, Modula-2, Fortran partial.

Pagsugod sa GNU Debugger o GDB

Gitawag ang GDB gamit ang gdb nga sugo. Sa pag-isyu og gdb, kini nagpakita sa pipila ka impormasyon mahitungod sa plataporma ug ihulog ka sa (gdb) prompt sama sa gipakita sa ubos.

 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)

I-type ang help nga lista aron makuha ang lain-laing klase sa mga sugo nga anaa sa sulod sa gdb. I-type ang help nga gisundan sa usa ka ngalan sa klase alang sa usa ka lista sa mga sugo sa kana nga klase. I-type ang tabang tanan para sa listahan sa tanang mga sugo. Gitugotan ang mga pinamubo sa ngalan sa command kung kini dili klaro. Pananglitan, mahimo nimong i-type ang n imbes i-type ang next o c para sa padayon ug uban pa.

Ang kasagarang gigamit nga gdb commands gilista sa mosunod nga lamesa. Kini nga mga sugo kay gamiton gikan sa gdb command prompt (gdb).

Timan-i ang kalainan tali sa duha ka command step ug next. Ang sunod nga command dili mosulod sa function kung ang sunod nga linya usa ka function call. Samtang ang lakang nga mando mahimong mosulod sa sulod nga function ug tan-awon kung unsa ang mahitabo didto.

Tagda ang mosunod nga source code.

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

Aron ma-debug ang output file kinahanglan namong i-compile ang parehas sa -g nga opsyon sa gcc ingon sa mosunod.

$ gcc -g sum.c -o sum

Ang output file sum mahimong i-attach sa gdb pinaagi sa bisan hain sa mosunod nga 2 ka paagi:

1. Pinaagi sa pagpiho sa output file isip argumento sa gdb.

$ gdb sum

2. Pagpadagan sa output file sulod sa gdb gamit ang file command.

$ gdb
(gdb) file sum

Ang list command naglista sa mga linya sa source code file ug nagpalihok sa pointer. Busa ang unang list magpakita sa unang 10 ka linya ug ang sunod nga list mopakita sa sunod nga 10 ug uban pa.

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

Aron masugdan ang pagpatuman, ipagawas ang run nga sugo. Karon ang programa gipatuman sa normal. Apan nakalimot mi sa pagbutang ug mga breakpoints sa source code para sa pag-debug, di ba? Kini nga mga breakpoint mahimong itakda alang sa mga gimbuhaton o sa piho nga mga linya.

(gdb) b main

Nota: Gigamit nako ang abbreviation b para sa break.

Human mabutang ang break point sa main function, ang pagpadagan pag-usab sa programa mohunong sa linya 11. Ang sama nga butang mahimo nga mahimo kung ang numero sa linya nahibal-an kaniadto.

(gdb) b sum.c:11

Karon lakang sa mga linya sa code gamit ang next o n command. Importante nga timan-an nga ang next command dili mosulod sa function code gawas kon ang break point gibutang sa function. Atong sulayan ang print nga sugo karon. Ibutang ang break point sa function sum sama sa ubos.

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

Kung ang programa nga gipadagan nanginahanglan mga parameter sa linya sa command dayon ihatag ang parehas kauban ang run nga mando ingon.

(gdb) run   . . .

Ang gipaambit nga mga file sa librarya nga nalangkit sa kasamtangan nga nagdagan nga programa mahimong ilista ingon.

(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

Ang GDB makahimo usab sa pag-usab sa mga variable sa tibuok pagpatuman sa programa. Atong sulayan kini. Sama sa gihisgutan sa ibabaw, ibutang ang break point sa linya 16 ug pagdagan ang programa.

(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

Karon a = 1, b = 2 ug ang resulta kinahanglan nga z = 3. Apan dinhi among giusab ang kataposang resulta ngadto sa z = 4 sa main function. Niining paagiha ang pag-debug mahimong dali gamit ang gdb.

Para makuha ang lista sa tanang breakpoints type info breakpoints.

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

Dinhi adunay usa lamang ka break point ug kini mao ang To. gi-enable ang pag-disable sa mga breakpoints itakda ang breakpoint number kauban ang disable command. Aron mahimo pagkahuman gamita ang enable nga sugo.

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

Mahimo usab nimong papason ang mga breakpoint gamit ang delete nga sugo.

Daghang mga proseso ang nagdagan sa background sa usa ka sistema sa GNU/Linux. Aron ma-debug ang usa ka proseso nga nagdagan una sa tanan kinahanglan naton pangitaon ang proseso id sa kana nga partikular nga proseso. Ang pidof nga sugo naghatag kanimo sa pid sa usa ka proseso.

$ pidof <process_name>

Karon kinahanglan namong ilakip kini nga pid sa gdb. Adunay 2 ka paagi.

1. Pinaagi sa pagtino sa pid uban sa gdb.

$ gdb -p <pid>

2. Gamit ang attach nga sugo gikan sa gdb.

(gdb) attach <pid>

Kana lang sa pagkakaron. Kini mga sukaranan lamang sa gdb aron makakuha usa ka maayong pagsugod sa pag-debug sa source code ug kini labi pa sa mga butang nga gipatin-aw sa ibabaw. Pananglitan, mahimo natong i-debug gamit ang stack information, environment variables ug daghan pa. Sulayi nga magdula sa tanan niini nga mga butang…