GNU Debugger oder GDB: E mächtege Quellcode Debugging Tool fir Linux Programmer


En Debugger spillt eng vital Roll an all Softwareentwécklungssystem. Keen kann e Bug-gratis Code op eemol schreiwen. Am Laf vun der Entwécklung ginn Bugs opgeworf a musse geléist ginn fir weider Verbesserung. En Entwécklungssystem ass onkomplett ouni Debugger. Wann Dir d'Open Source Entwéckler Gemeinschaft berécksiichtegt, ass GNU Debugger hir bescht Wiel. Et gëtt och fir kommerziell Softwareentwécklung op UNIX Typ Plattformen benotzt.

GNU Debugger, och bekannt als gdb, erlaabt eis duerch de Code ze schlecken wärend et ausféiert oder wat e Programm probéiert huet am Moment ze maachen ier et erofgefall ass. GDB hëlleft eis grondsätzlech véier Haaptsaachen ze maachen fir Mängel am Quellcode ze fangen.

  1. Start de Programm, spezifizéiert Argumenter déi den allgemenge Verhalen beaflosse kënnen.
  2. Stopp de Programm ënner spezifizéierte Konditiounen.
  3. Undersicht de Crash oder wéini de Programm gestoppt gouf.
  4. Ännert de Code an experimentéiert direkt mam geännerten Code.

Mir kënnen gdb benotze fir Programmer ze debuggen, déi an C an C ++ geschriwwe sinn ouni vill Effort. Vun elo un Ënnerstëtzung fir aner Programméierungssprooche wéi D, Modula-2, Fortran sinn deelweis.

Start mat GNU Debugger oder GDB

GDB gëtt mam Kommando gdb opgeruff. Beim Emissioun gdb, weist et e puer Informatioun iwwer Plattform an fällt Iech an d'(gdb) Prompt wéi hei ënnendrënner.

 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)

Typ Hëllef Lëscht fir déi verschidde Klasse vu Kommandoen, déi bannent gdb verfügbar sinn, erauszekréien. Typ Hëllef gefollegt vun engem Klassennumm fir eng Lëscht vun Kommandoen an där Klass. Typ help all fir d'Lëscht vun alle Kommandoen. Kommando Numm Ofkierzungen sinn erlaabt wann se eendeiteg sinn. Zum Beispill kënnt Dir n tippen anstatt nächst oder c fir weider a sou weider.

Allgemeng benotzt gdb Kommandoen sinn an der folgender Tabell opgelëscht. Dës Befehle solle vun der gdb Kommandoprompt (gdb) benotzt ginn.

Notéiert den Ënnerscheed tëscht den zwee Kommandoen Schrëtt an nächst. Den nächste Kommando geet net an d'Funktioun wann d'nächst Zeil e Funktiounsopruff ass. Wärend de Schrëtt Kommando kann an d'Funktioun goen a kucken wat do geschitt.

Bedenkt de folgende Quellcode.

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

Fir d'Ausgabdatei ze debuggen, musse mir d'selwecht kompiléieren mat -g Optioun op gcc wéi follegt.

$ gcc -g sum.c -o sum

D'Ausgabdatei sum kann op gdb iwwer entweder vun den folgenden 2 Weeër befestegt ginn:

1. Andeems Dir d'Ausgabdatei als Argument op gdb spezifizéiert.

$ gdb sum

2. Ausgangsdatei bannen gdb ausféieren mat Datei Kommando.

$ gdb
(gdb) file sum

De Kommando Lëscht lëscht Zeilen an der Quellcodedatei a bewegt den Zeiger. Also déi éischt Lëscht weist déi éischt 10 Zeilen an déi nächst Lëscht weist déi nächst 10 a sou weider.

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

Fir d'Ausféierung unzefänken, gitt de Kommando run aus. Elo gëtt de Programm normalerweis ausgefouert. Awer mir hu vergiess e puer Breakpunkten am Quellcode fir Debugging ze setzen, richteg? Dës Breakpunkte kënne fir Funktiounen oder op spezifizéierte Linnen spezifizéiert ginn.

(gdb) b main

Notiz: Ech hunn eng Ofkierzung b fir Paus benotzt.

No engem Kader Paus Punkt op Haaptrei Funktioun, rerunning de Programm op der Linn ophalen 11. Déi selwecht Saach kann a Kraaft gemaach ginn, wann d'Linn Zuel virun bekannt ass.

(gdb) b sum.c:11

Gitt elo duerch d'Zeilen vum Code mam Kommando nächst oder n. Et ass wichteg ze notéieren datt de nächste Kommando net an de Funktiounscode geet ausser wann e Pauspunkt op der Funktioun gesat gëtt. Loosst eis de Kommando print elo ausprobéieren. Set Paus Punkt op Funktioun Zomm wéi ënnert.

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

Wann de Programm, deen ausgefouert gëtt, Kommandozeilparameter erfuerdert, da gitt déiselwecht mam Kommando run als.

(gdb) run   . . .

Shared Bibliothéikdateien, déi mam aktuellen lafende Programm verbonne sinn, kënnen als opgelëscht ginn.

(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 ass och fäeg Variabelen während der Ausféierung vum Programm z'änneren. Loosst eis dëst ausprobéieren. Wéi uewen ernimmt, setzt de Pauspunkt op der Linn 16 a lafen de Programm.

(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

Elo a = 1, b = 2 an d'Resultat soll z = 3. Awer hei hu mir d'Endresultat op z = 4 an der Haaptfunktioun geännert. Op dës Manéier kann Debugging méi einfach gemaach ginn mat gdb.

Fir d'Lëscht vun all Breakpoints ze kréien, gitt Info Breakpoints.

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

Hei gëtt et nëmmen ee Pauspunkt an et ass To. aktivéiert de Breakpoints auszeschalten spezifizéieren d'Breakpunktnummer zesumme mam Kommando disable. Fir duerno z'aktivéieren, benotzt de Kommando enable.

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

Dir kënnt och d'Breakpoints mam Kommando läschen läschen.

Vill Prozesser lafen am Hannergrond an engem GNU/Linux System. Fir e lafende Prozess ze debuggen als éischt musse mir d'Prozess-ID vun deem bestëmmte Prozess fannen. pidof Kommando gëtt Iech de Pid vun engem Prozess.

$ pidof <process_name>

Elo musse mir dëse Pid op gdb befestigen. Et ginn 2 Weeër.

1. Andeems Dir Pid zesumme mat gdb spezifizéiert.

$ gdb -p <pid>

2. Benotzt attach Kommando aus gdb.

(gdb) attach <pid>

Dat ass alles fir elo. Dëst sinn nëmmen d'Basics vu gdb fir e gudde Start beim Debugging vum Quellcode ze kréien an et ass vill méi wéi d'Saachen hei uewen erkläert. Zum Beispill kënne mir debuggen mat der Stackinformatioun, Ëmfeldvariablen a vill méi. Probéiert mat all dëse Saachen ze spillen ...