GNU silur või GDB: võimas lähtekoodi silumise tööriist Linuxi programmidele


Silur mängib olulist rolli igas tarkvaraarendussüsteemis. Keegi ei saa korraga veatut koodi kirjutada. Arendamise käigus tõstatatakse vigu ja need tuleb edasiseks täiustamiseks lahendada. Arendussüsteem on ilma silurita puudulik. Arvestades avatud lähtekoodiga arendajate kogukonda, on GNU Debugger nende parim valik. Seda kasutatakse ka äritarkvara arendamiseks UNIX-tüüpi platvormidel.

GNU silur, tuntud ka kui gdb, võimaldab meil koodi läbi vaadata, kui see käivitub või mida programm proovis teha enne, kui see kokku kukkus. GDB aitab meil lähtekoodi vigade leidmiseks teha põhimõtteliselt nelja peamist asja.

  1. Käivitage programm, täpsustades argumendid, mis võivad üldist käitumist mõjutada.
  2. Peatage programm kindlaksmääratud tingimustel.
  3. Uurige krahhi või programmi peatamist.
  4. Muutke koodi ja muudetud koodiga kohe katsetamiseks.

Gdb abil saame C ja C ++ -s kirjutatud programme ilma suurema vaevata siluda. Praegu on teiste programmeerimiskeelte, näiteks D, Modula-2, Fortran tugi osaline.

GNU siluri või GDB-ga alustamine

GDB käivitatakse käsuga gdb . gdb väljaandmisel kuvab see platvormi kohta teavet ja viib teid ( gdb ) viipale, nagu allpool näidatud.

 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)

Sisestage help list, et kuvada gdb-s saadaval olevad erinevad käsuklassid. Selle klassi käskude loendi sisestamiseks tippige help , millele järgneb klassi nimi. Kõigi käskude loendi jaoks tippige help all . Käsunime lühendid on lubatud, kui need on üheselt mõistetavad. Näiteks võite sisestada n selle asemel, et sisestada järgmine või c jätka ja nii edasi.

Tavaliselt kasutatavad gdb käsud on loetletud järgmises tabelis. Neid käske tuleb kasutada käsuviibalt gdb ( gdb ).

Pange tähele kahe käsu samm ja järgmine erinevust. Järgmine käsk ei lähe funktsiooni sisse, kui järgmine rida on funktsioonikõne. Kusjuures käsk step võib siseneda sisefunktsiooni ja vaadata, mis seal juhtub.

Mõelge järgmisele lähtekoodile.

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

Väljundfaili silumiseks peame sama kompenseerima suvandiga -g gcc-le järgmiselt.

$ gcc -g sum.c -o sum

Väljundfaili summa saab lisada gdb-le kahel järgmisel viisil:

1. Määrates väljundfaili argumendiks gdb-le.

$ gdb sum

2. Käivitage väljundfail gdb-s käsuga fail .

$ gdb
(gdb) file sum

Käsk list loetleb lähtekoodifaili read ja liigutab kursorit. Nii et esimene list kuvab esimesed 10 rida ja järgmine list kuvab järgmised 10 rida ja nii edasi.

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

Käivitamise alustamiseks väljastage käsk run . Nüüd käivitatakse programm normaalselt. Kuid me unustasime silumisele lähtekoodi mõned katkestuspunktid panna, eks? Neid murdepunkte saab määrata funktsioonide jaoks või kindlatel joontel.

(gdb) b main

Märkus: Olen katkestuseks kasutanud lühendit b

Pärast murdepunkti seadmist põhifunktsioonile peatub programmi uuesti käivitamine joonel 11. Sama asja saab rakendada ka siis, kui rea number on varem teada.

(gdb) b sum.c:11

Nüüd astuge läbi koodiridade, kasutades käsku järgmine või n . Oluline on märkida, et käsk next ei lähe funktsioonikoodi sisse, kui funktsioonile pole määratud katkestuspunkt. Proovime nüüd käsku print proovida. Määrake funktsioonisummale murdepunkt nagu allpool.

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

Kui käivitatav programm nõuab käsurea parameetreid, esitage koos käsuga run sama mis.

(gdb) run   . . .

Praeguse töötava programmiga seotud jagatud teegi faile saab loetleda kui.

(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 on võimeline muutujaid muutma ka kogu programmi täitmise ajal. Proovime seda. Nagu eespool mainitud, määrake real 16 murdepunkt ja käivitage 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

Nüüd a = 1, b = 2 ja tulemus peaks olema z = 3. Kuid siin muutsime põhifunktsiooni lõpptulemuseks z = 4. Nii saab silumist gdb abil hõlpsamaks muuta.

Kõigi murdepunktide loendi saamiseks sisestage info murdepunktid .

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

Siin on ainult üks murdepunkt ja see on To. lubatud keelake katkestuspunktid määrake katkestuspunkti number koos käsuga keelata . Pärastpoole lubamiseks kasutage käsku enable .

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

Katkestuspunkte saate kustutada ka käsuga kustuta .

GNU/Linuxi süsteemis töötab taustal arvukalt protsesse. Käimasoleva protsessi silumiseks peame kõigepealt leidma selle konkreetse protsessi ID. Käsk pidof annab teile protsessi pidamise.

$ pidof <process_name>

Nüüd peame selle pidu lisama gdb-le. On kahte viisi.

1. Täpsustades pid koos gdb-ga.

$ gdb -p <pid>

2. Kasutades käsku attach gdb-st.

(gdb) attach <pid>

Praeguseks kõik. Need on lähtekoodi silumisel hea alguse saamiseks vaid gdb põhitõed ja see on palju enamat kui ülalpool selgitatud asjad. Näiteks saame siluda, kasutades virna teavet, keskkonnamuutujaid ja palju muud. Proovige kõigi nende asjadega ringi mängida ...