Weboldal keresés

GNU Debugger vagy GDB: Erőteljes forráskód-hibakereső eszköz Linux-programokhoz


A hibakereső létfontosságú szerepet játszik minden szoftverfejlesztő rendszerben. Senki sem tud egyszerre hibamentes kódot írni. A fejlesztés során hibák merülnek fel, amelyeket a további fejlesztés érdekében meg kell oldani. Hibakereső nélkül egy fejlesztési rendszer nem teljes. Figyelembe véve a nyílt forráskódú fejlesztői közösséget, a GNU Debugger a legjobb választás. Kereskedelmi szoftverfejlesztéshez is használják UNIX típusú platformokon.

A GNU Debugger, más néven gdb, lehetővé teszi számunkra, hogy a kódon keresztül csússzon, miközben fut, vagy mit próbált egy program az összeomlás előtti pillanatban. A GDB alapvetően négy fő dolgot segít nekünk a forráskód hibáinak felderítése érdekében.

  1. Indítsa el a programot, és adja meg azokat az argumentumokat, amelyek befolyásolhatják az általános viselkedést.
  2. Adott feltételek mellett állítsa le a programot.
  3. Vizsgálja meg az összeomlást vagy a program leállítását.
  4. Változtassa meg a kódot, és azonnal kísérletezzen a módosított kóddal.

A gdb-t a C és C++ nyelven írt programok hibakeresésére használhatjuk különösebb erőfeszítés nélkül. Jelenleg más programozási nyelvek, például a D, Modula-2, Fortran támogatása részleges.

A GNU Debugger vagy GDB használatának megkezdése

A GDB meghívása a gdb paranccsal történik. A gdb kiadásakor megjelenít néhány információt a platformról, és a (gdb) promptba ugrik az alábbiak szerint. .

[root@fedora20 ~]# gdb
Minta kimenet
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)

Írja be a help list parancsot a gdb-n belül elérhető parancsok különböző osztályainak megtekintéséhez. Írja be a help szót, majd írja be az osztály nevét, hogy megjelenjen az adott osztályban található parancsok listája. Írja be a help all parancsot az összes parancs listájához. A parancsnevek rövidítései megengedettek, ha egyértelműek. Például beírhatja az n szót a next vagy a c helyett > a folytatás és így tovább.

A leggyakrabban használt GDB parancsok

A gyakran használt gdb-parancsok a következő táblázatban találhatók. Ezeket a parancsokat a gdb parancssorból (gdb) kell használni.

Command

Leírás

run

Programvégrehajtás indítása

quit

Kilépés a gdb-ből

print expr

Kifejezés nyomtatása, ahol a kifejezés változónév is lehet

next

Ugrás a következő sorra

step

Lépjen a következő sorba

continue

Folytatás az aktuális sortól a program végéig vagy a következő töréspontig

Vegye figyelembe a két parancs közötti különbséget: step és next. A next parancs nem lép be a függvénybe, ha a következő sor egy függvényhívás. Míg a step parancs beléphet a belső funkcióba, és megnézheti, mi történik ott.

Egy minta munkamenet a GDB-vel

Vegye figyelembe a következő forráskódot.


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

A kimeneti fájl hibakereséséhez a -g kapcsolóval le kell fordítanunk a gcc-re az alábbiak szerint.

gcc -g sum.c -o sum

A sum kimeneti fájl a következő két mód egyikén csatolható a gdb-hez:

1. A kimeneti fájl megadásával a gdb argumentumaként.

gdb sum

2. Futtassa a kimeneti fájlt a gdb-n belül a file paranccsal.

gdb
(gdb) file sum

A list parancs felsorolja a forráskódfájl sorait, és mozgatja a mutatót. Tehát az első lista az első 10 sort, a következő lista pedig a következő 10-et és így tovább.

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

A végrehajtás elindításához adja ki a run parancsot. Most a program normálisan fut. De elfelejtettünk néhány töréspontot megadni a forráskódban a hibakereséshez, igaz? Ezek a töréspontok függvényekhez vagy meghatározott sorokhoz adhatók meg.

(gdb) b main

Megjegyzés: A break kifejezéshez a b rövidítést használtam.

A fő funkciónál a töréspont beállítása után a program újrafutása a 11-es sorban áll meg. Ugyanez érvényesíthető, ha a sorszám korábban ismert.

(gdb) b sum.c:11

Most léptessen végig a kódsorokon a next vagy az n paranccsal. Fontos megjegyezni, hogy a next parancs nem lép be a függvénykódba, hacsak nincs beállítva töréspont a függvényen. Próbáljuk ki most a print parancsot. Állítsa be a töréspontot a függvény összegére az alábbiak szerint.

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

Ha a futtatott program parancssori paramétereket igényel, adja meg ugyanazt a run paranccsal együtt.

(gdb) run   . . .

Az aktuálisan futó programhoz társított megosztott könyvtári fájlok listázhatók.

(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

Változók módosítása

A GDB képes a változók módosítására is a program végrehajtása során. Próbáljuk ki ezt. Ahogy fentebb említettük, állítsa be a töréspontot a 16. sorban, és futtassa a programot.

(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

Most a=1, b=2, az eredmény pedig z=3. De itt megváltoztattuk a végeredménytz=4re a fő függvényben. Ily módon a hibakeresés megkönnyíthető a gdb használatával.

Töréspontok engedélyezése/letiltása

Az összes töréspont listájának megtekintéséhez írja be az info breakpoints elemet.

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

Itt csak egy töréspont van, és ez a To. engedélyezve a töréspontok letiltása adja meg a töréspont számát a disable paranccsal együtt. A későbbi engedélyezéshez használja az enable parancsot.

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

A töréspontokat a delete paranccsal is törölheti.

Futó folyamatok hibakeresése

Számos folyamat fut a háttérben egy GNU/Linux rendszerben. Egy futó folyamat hibakereséséhez mindenekelőtt meg kell találnunk az adott folyamat folyamatazonosítóját. A pidof parancs megadja a folyamat pid-jét.

pidof <process_name>

Most csatolnunk kell ezt a pid-t a gdb-hez. 2 módja van.

1. A pid és a gdb megadásával.

gdb -p <pid>

2. Használja a gdb attach parancsát.

(gdb) attach <pid>

Ez minden most. Ezek csak a gdb alapjai a forráskód hibakeresésének kezdetéhez, és ez sokkal több, mint a fent leírt dolgok. Például hibakeresést végezhetünk a vereminformációk, környezeti változók és még sok más használatával. Próbálj meg eljátszani ezekkel a cuccokkal…