GNU atkļūdotājs vai GDB: jaudīgs pirmkodu atkļūdošanas rīks Linux programmām


Atkļūdotājam ir būtiska loma jebkurā programmatūras izstrādes sistēmā. Neviens nevar uzreiz uzrakstīt kodu bez kļūdām. Attīstības gaitā tiek novērstas kļūdas, un tās ir jārisina, lai tās tālāk uzlabotu. Izstrādes sistēma nav pilnīga bez atkļūdotāja. Ņemot vērā atvērtā koda izstrādātāju kopienu, GNU atkļūdotājs ir viņu labākā izvēle. To izmanto arī komerciālas programmatūras izstrādei UNIX tipa platformās.

GNU atkļūdotājs, pazīstams arī kā gdb, ļauj mums ielīst kodam, kamēr tas tiek izpildīts, vai to, ko programma mēģināja darīt brīdī, kad tas avarēja. GDB būtībā palīdz mums izdarīt četras galvenās lietas, lai noķertu avota koda trūkumus.

  1. Sāciet programmu, norādot argumentus, kas var ietekmēt vispārējo uzvedību.
  2. Pārtrauciet programmu noteiktos apstākļos.
  3. Pārbaudiet avāriju vai programmas apturēšanu.
  4. Mainiet kodu un nekavējoties eksperimentējiet ar modificēto kodu.

Mēs varam izmantot gdb, lai atkļūdotu programmas, kas rakstītas C un C ++, bez lielām pūlēm. Pašlaik atbalsts citām programmēšanas valodām, piemēram, D, Modula-2, Fortran, ir daļējs.

Darba sākšana ar GNU atkļūdotāju vai GDB

GDB tiek izsaukts, izmantojot komandu gdb . Izsniedzot gdb , tas parāda informāciju par platformu un iekļauj uzvednē ( gdb ), kā parādīts zemāk.

 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)

Ierakstiet help list, lai uzzinātu dažādas komandu klases, kas pieejamas gdb. Ierakstiet help , kam seko klases nosaukums, lai pievienotu šīs klases komandu sarakstu. Visu komandu sarakstam ierakstiet palīdzēt visiem . Komandu nosaukumu saīsinājumi ir atļauti, ja tie ir nepārprotami. Piemēram, varat ierakstīt n tā vietā, lai ierakstītu next vai c turpināt un tā tālāk.

Parasti izmantotās gdb komandas ir norādītas šajā tabulā. Šīs komandas ir jāizmanto no komandrindas gdb ( gdb ).

Ievērojiet atšķirību starp abām komandām solis un nākamais . Nākamā komanda neietilpst funkcijas iekšpusē, ja nākamā rinda ir funkcijas izsaukums. Tā kā komanda step var iekļūt iekšējā funkcijā un redzēt, kas tur notiek.

Apsveriet šādu avota kodu.

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

Lai atkļūdotu izejas failu, mums tas pats jāapkopo ar opciju -g gcc šādi:

$ gcc -g sum.c -o sum

Izvades failu summa var pievienot gdb, izmantojot kādu no šiem diviem veidiem:

1. Norādot izvades failu kā argumentu gdb.

$ gdb sum

2. Izvades faila palaišana gdb iekšienē, izmantojot komandu fails .

$ gdb
(gdb) file sum

Komanda saraksts uzskaita avota koda faila rindas un pārvieto rādītāju. Tātad pirmais saraksts parādīs pirmās 10 rindas, bet nākamais saraksts parādīs nākamās 10 un tā tālāk.

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

Lai sāktu izpildi, izsniedziet komandu palaist . Tagad programma tiek izpildīta normāli. Bet mēs aizmirsām avota kodā ielikt dažus pārtraukumpunktus atkļūdošanai, vai ne? Šos pārtraukuma punktus var norādīt funkcijām vai noteiktās līnijās.

(gdb) b main

Piezīme: Es pārtraukumam izmantoju saīsinājumu b.

Pēc pārtraukuma punkta iestatīšanas galvenajā funkcijā programmas atkārtota palaišana apstāsies pie līnijas 11. To pašu var ieviest, ja līnijas numurs ir zināms iepriekš.

(gdb) b sum.c:11

Tagad pārejiet pa koda rindām, izmantojot komandu next vai n . Ir svarīgi atzīmēt, ka komanda next neietilpst funkcijas kodā, ja vien funkcijai nav iestatīts pārtraukuma punkts. Izmēģināsim komandu print tūlīt. Funkcijas summai iestatiet pārtraukuma punktu, kā norādīts zemāk.

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

Ja palaistajai programmai ir nepieciešami komandrindas parametri, kopā ar palaist komandu norādiet to pašu.

(gdb) run   . . .

Koplietojamās bibliotēkas failus, kas saistīti ar pašreizējo darbojošos programmu, var uzskaitīt 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

GDB var arī mainīt mainīgos visā programmas izpildē. Izmēģināsim to. Kā minēts iepriekš, iestatiet pārtraukuma punktu 16. rindā un palaidiet programmu.

(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

Tagad a = 1, b = 2 un rezultātam jābūt z = 3. Bet šeit mēs mainījām gala rezultātu uz z = 4 galvenajā funkcijā. Tādā veidā atkļūdošanu var atvieglot, izmantojot gdb.

Lai iegūtu visu pārtraukumpunktu sarakstu, ierakstiet info pārtraukumpunkti .

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

Šeit ir tikai viens pārtraukuma punkts, un tas ir. iespējots atspējojiet pārtraukuma punktus, norādiet pārtraukuma punkta numuru kopā ar komandu atspējot . Lai pēc tam iespējotu, izmantojiet komandu iespējot .

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

Pārtraukuma punktus var izdzēst arī ar komandu dzēst .

GNU/Linux sistēmā fonā darbojas daudzi procesi. Lai atkļūdotu darbojošos procesu, vispirms jāatrod konkrētā procesa procesa ID. pidof komanda dod jums procesa ilgumu.

$ pidof <process_name>

Tagad mums šis pid ir jāpievieno gdb. Ir 2 veidi.

1. Norādot pid kopā ar gdb.

$ gdb -p <pid>

2. Izmantojot pievienot komandu no gdb.

(gdb) attach <pid>

Tas pagaidām ir viss. Šie ir tikai gdb pamati, lai iegūtu labu sākumu atkļūdot avota kodu, un tas ir daudz vairāk nekā iepriekš paskaidrotais. Piemēram, mēs varam atkļūdot, izmantojot kaudzes informāciju, vides mainīgos un daudz ko citu. Mēģiniet izspēlēties ar visām šīm lietām ...