GNU Debugger bruges til at fejlsøge et program, til at analysere nedbrud eller til at se, hvad programmet gør på et bestemt tidspunkt. Det blev udviklet af GNU Project i 1980'erne og har været en af de mest udbredte kommandolinjefejlfindere såvel som en af de mest populære GNU-software.
Lad os først skrive et lille C-program, som vi derefter fejlretter. For at komme i gang skal du oprette en ny .c
fil ved hjælp af vim
eller en redaktør efter eget valg:
vim test.c
Opret følgende C-program:
#include int main() { int i = 5; float f = 5,5 i = i + 3; f = f + 2,2; printf("Værdien af i og f er: %d og %f\n", i, f); returner 0; }
Trykke Flugt
for at gå til vim-kommandotilstand. Skriv derefter :wq
for at gemme programmet og afslutte.
Kompiler og se om programmet kører:
gcc test.c -o test ./test Værdien af i og f er: 8 og 7,700000
For at aktivere fejlfindingsunderstøttelse i et program, vi kompilerer det med -g
flag. Hvis flaget ikke bruges, kan brugeren stadig fejlsøge programmet, dog med begrænsede muligheder.
gcc test.c -g -o test
For at begynde at fejlfinde vores eksekverbare fil prøve
i gdb
, vi løber:
gdb test
Det vil åbne gdb
konsol, hvor du kan skrive gdb
kommandoer. For at se en liste over kommandoer, brug Hjælp
kommando.
$(gdb) hjælp Liste over klasser af kommandoer: aliaser -- Aliaser af andre kommandoer breakpoints -- Få programmet til at stoppe på bestemte punkter data -- Undersøgelse af datafiler -- Specificering og undersøgelse af filer interne -- Vedligeholdelseskommandoer er uklare -- Obskure funktioner kører -- Kørsel af programstakken -- Undersøgelse af stakstatus -- Understøttelse af statusforespørgsler -- Sporpunkter for supportfaciliteter -- Sporing af programafvikling uden at stoppe programmet brugerdefineret -- Brugerdefinerede kommandoer Skriv "hjælp" efterfulgt af et klassenavn for en liste over kommandoer i den klasse. Skriv "hjælp alle" for listen over alle kommandoer. Skriv "hjælp" efterfulgt af kommandonavn for fuld dokumentation. Skriv "apropos ord" for at søge efter kommandoer relateret til "ord". Kommandonavnsforkortelser er tilladt, hvis de er utvetydige.
Du kan derefter skrive hjælp klassenavn
for at se kommandoer, der tilhører den pågældende klasse. For at søge kommandoer ved hjælp af en understreng, brug apropos understreng
.
For at indstille et brudpunkt, når programmet går ind i en funktion, løb:
$(gdb) break main
Her sætter vi et brudpunkt ved den eneste funktion i vores kode, dvs. vigtigste
. Brug kommandoen løb
for at udføre programmet indtil næste pausepunkt, eller indtil exit.
$(gdb) køre
For at indstille et brudpunkt på et bestemt sted i en funktion, brug:
pause *hoved + 4
Dette vil konfigurere et brudpunkt ved den 4. linje af funktions hoved.
Nu, at gå over programstrømmen til næste kodelinje, bare køre trin
kommando.
$(gdb) trin 5: float f = 5,5;
For at vise indholdet af en variabel, løb Skærm
.
$(gdb) display i 6: i = 5
For at ændre indholdet af en variabel, som kan være påkrævet for at analysere afviklingen af et program under specifikke værdier af en variabel, run sæt variabel =Udtryk
.
$(gdb) sæt variabel i=10 $(gdb) display i 7: i = 10
Her kan 'Udtrykket' være et hvilket som helst gyldigt (aritmetisk / logisk) udtryk. For nemheds skyld tildeler vi blot en anden værdi (10) til variabel jeg
.
For at udskrive samlingskoden for programmet, brug kommando adskille funktionsnavn
:
Brug bare skille ad
at udskrive samlingskode for hele programmet. Bemærk pilen ved en bestemt linje i montagekoden. Det angiver, at fejlfindingssessionen i øjeblikket er sat på pause på den pågældende hukommelsesplacering (dvs. den kodelinje).
For at springe debuggeren til en bestemt linje kode, løb:
$(gdb) jump *main + 2 Fortsætter ved 0x400528. Knækpunkt 2, 0x000000000040052a i main () ved test.c:3 3 int main() { 1: i = 2: f = 3: h = (void *) 0x0 4: main = {int ()} 0x400526 5: i =
Dette vil få debuggeren til at springe ved hukommelsesplaceringen af den anden kodelinje i funktion vigtigste
. Bemærk, at jeg her hoppede fra start af hoved til direkte anden placering. Derfor variabel jeg
blev aldrig indstillet, hvilket resulterer i, at debuggeren kaster fejl, at den ikke kan få adgang til hukommelsesindholdet på variabelens adresse jeg
.
Dette er nogle af de grundlæggende kommandoer, som kan hjælpe dig i gang med at fejlfinde en eksekverbar fil i Linux. Vi håber, at du finder oplysningerne på denne side nyttige.