GNU Debugger eða GDB: Öflugt frumkóðakembiforrit fyrir Linux forrit


Villuleit gegnir mikilvægu hlutverki í hvaða hugbúnaðarþróunarkerfi sem er. Enginn getur skrifað villulausan kóða í einu. Meðan á þróuninni stendur er verið að koma upp villum sem þarf að leysa til frekari endurbóta. Þróunarkerfi er ófullkomið án villuleitar. Miðað við opinn hugbúnaðarsamfélagið er GNU Debugger besti kosturinn þeirra. Það er einnig notað fyrir viðskiptahugbúnaðarþróun á UNIX tegundarpöllum.

GNU Debugger, einnig þekktur sem gdb, gerir okkur kleift að laumast í gegnum kóðann á meðan hann keyrir eða hvað forrit var að reyna að gera í augnablikinu áður en það hrundi. GDB hjálpar okkur í grundvallaratriðum að gera fjóra megin hluti til að ná göllum í frumkóðann.

  1. Ræstu forritið, tilgreindu rök sem geta haft áhrif á almenna hegðun.
  2. Stöðvaðu forritið við tilgreind skilyrði.
  3. Skoðaðu hrunið eða hvenær forrit var stöðvað.
  4. Breyttu kóðanum og gerðu tilraunir með breytta kóðann samstundis.

Við getum notað gdb til að kemba forrit sem eru skrifuð í C og C++ án mikillar fyrirhafnar. Eins og er er stuðningur við önnur forritunarmál eins og D, Modula-2, Fortran að hluta.

Byrjaðu með GNU Debugger eða GDB

GDB er kallað fram með gdb skipuninni. Þegar þú gefur út gdb birtir það upplýsingar um vettvang og sleppir þér í (gdb) hvetja eins og sýnt er hér að neðan.

 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)

Sláðu inn hjálp lista til að fá út mismunandi flokka skipana sem eru í boði inni í gdb. Sláðu inn hjálp og síðan bekkjarheiti fyrir lista yfir skipanir í þeim flokki. Sláðu inn help all fyrir listann yfir allar skipanir. Skammstöfun skipanafna eru leyfðar ef þær eru ótvíræðar. Til dæmis geturðu skrifað n í stað þess að slá inn næsta eða c fyrir halda áfram og svo framvegis.

Algengar gdb skipanir eru taldar upp í eftirfarandi töflu. Þessar skipanir á að nota frá gdb skipanalínunni (gdb).

Athugaðu muninn á skipunum tveimur skref og næsta. Næsta skipun fer ekki inn í fall ef næsta lína er fallkall. En skref skipun getur farið inn í aðgerðina og séð hvað gerist þar.

Íhugaðu eftirfarandi frumkóða.

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

Til þess að kemba úttaksskrána þurfum við að setja saman það sama með -g valmöguleikanum í gcc sem hér segir.

$ gcc -g sum.c -o sum

Hægt er að tengja úttaksskrána summa við gdb á annan hvorn af eftirfarandi 2 leiðum:

1. Með því að tilgreina úttaksskrána sem rök fyrir gdb.

$ gdb sum

2. Keyra úttaksskrá inni í gdb með skrá skipuninni.

$ gdb
(gdb) file sum

Skipunin list sýnir línur í frumkóðaskránni og færir bendilinn. Þannig að fyrsti listi sýnir fyrstu 10 línurnar og næsti listi sýnir næstu 10 og svo framvegis.

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

Til að hefja framkvæmd skaltu gefa út skipunina run. Nú er forritið keyrt venjulega. En við gleymdum að setja nokkur brot í frumkóðann fyrir villuleit, ekki satt? Hægt er að tilgreina þessa brotpunkta fyrir aðgerðir eða á tilteknum línum.

(gdb) b main

Athugið: Ég hef notað skammstöfun b fyrir brot.

Eftir að hlé hefur verið stillt á aðalaðgerð mun endurkeyrsla forritsins stöðvast við línu 11. Það sama er hægt að gera ef línunúmerið er þekkt áður.

(gdb) b sum.c:11

Farðu nú í gegnum kóðalínurnar með næsta eða n skipuninni. Það er mikilvægt að hafa í huga að skipun næsta fer ekki inn í aðgerðakóða nema brotspunktur sé stilltur á aðgerðina. Við skulum prófa prenta skipunina núna. Stilltu brotpunkt á fallsummu eins og hér að neðan.

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

Ef forritið sem verið er að keyra krefst skipanalínubreytu þá gefðu það sama ásamt run skipuninni sem.

(gdb) run   . . .

Samnýtt bókasafnsskrár sem tengjast núverandi forriti sem er í gangi er hægt að skrá sem.

(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 er einnig fær um að breyta breytum í gegnum framkvæmd forritsins. Prófum þetta. Eins og getið er hér að ofan settu brotpunkt á línu 16 og keyrðu forritið.

(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

Núna er a = 1, b = 2 og niðurstaðan ætti að vera z = 3. En hér breyttum við lokaniðurstöðunni í z = 4 í aðalfallinu. Á þennan hátt er hægt að auðvelda villuleit með því að nota gdb.

Til að fá lista yfir alla brotpunkta skaltu slá inn upplýsingabrot.

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

Hér er aðeins einn brotpunktur og það er To. virkt slökkva á brotpunktunum tilgreinir brotpunktanúmerið ásamt disable skipuninni. Til að virkja eftirá skaltu nota enable skipunina.

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

Þú getur líka eytt brotpunktunum með skipuninni delete.

Fjölmargir ferlar eru í gangi í bakgrunni í GNU/Linux kerfi. Til að kemba ferli sem er í gangi þurfum við fyrst og fremst að finna ferli auðkenni þess tiltekna ferlis. pidof skipunin gefur þér pid ferlis.

$ pidof <process_name>

Nú þurfum við að festa þennan pid við gdb. Það eru 2 leiðir.

1. Með því að tilgreina pid ásamt gdb.

$ gdb -p <pid>

2. Notaðu attach skipunina frá gdb.

(gdb) attach <pid>

Það er allt í bili. Þetta eru aðeins grunnatriði gdb til að komast vel af stað í kembiforritum og það er miklu meira en það sem útskýrt er hér að ofan. Til dæmis getum við villuleitt með því að nota staflaupplýsingarnar, umhverfisbreytur og margt fleira. Reyndu að leika þér með allt þetta dót...