GNU Debugger brukes til å feilsøke et program, analysere krasj, eller for å se hva programmet gjør på et bestemt punkt. Den ble utviklet av GNU-prosjektet på 1980-tallet og har vært en av de mest brukte kommandolinjefeilsøkerne samt en av de mest populære GNU-programvarene.
La oss først skrive et lite C-program som vi deretter skal feilsøke. For å komme i gang, opprett en ny .c
fil ved hjelp av vim
eller hvilken som helst redaktør etter eget valg:
vim test.c
Lag følgende C-program:
#include int main() { int i = 5; float f = 5,5 i = i + 3; f = f + 2,2; printf("Verdien av i og f er: %d og %f\n", i, f); returner 0; }
trykk Flukt
for å gå til vim-kommandomodus. Skriv deretter :wq
for å lagre programmet og avslutte.
Kompiler og se om programmet kjører:
gcc test.c -o test ./test Verdien av i og f er: 8 og 7,700000
For å aktivere feilsøkingsstøtte i et program, vi kompilerer det med -g
flagg. Hvis flagget ikke brukes, kan brukeren fortsatt feilsøke programmet, om enn med begrensede alternativer.
gcc test.c -g -o test
For å begynne å feilsøke vår kjørbare fil test
i gdb
, vi løper:
gdb test
Den vil åpne gdb
konsoll, hvor du kan skrive inn gdb
kommandoer. For å se en liste over kommandoer, bruk hjelp
kommando.
$(gdb) hjelp Liste over klasser av kommandoer: aliaser -- Aliaser til andre kommandoer bruddpunkter -- Får programmet til å stoppe på bestemte punkter data -- Undersøker datafiler -- Spesifiserer og undersøker filer internt -- Vedlikeholdskommandoer obskure -- Obskure funksjoner som kjører -- Kjøre programstabelen -- Undersøke stabelstatus -- Statusforespørsler støtte -- Sporepunkter for støttefasiliteter -- Sporing av programkjøring uten å stoppe programmet brukerdefinert -- Brukerdefinerte kommandoer Skriv "hjelp" etterfulgt av et klassenavn for en liste over kommandoer i den klassen. Skriv "hjelp alle" for listen over alle kommandoer. Skriv "hjelp" etterfulgt av kommandonavn for full dokumentasjon. Skriv "apropos ord" for å søke etter kommandoer relatert til "ord". Kommandonavnforkortelser er tillatt hvis de er entydige.
Du kan deretter skrive hjelpe klassenavn
for å se kommandoer som tilhører den klassen. For å søke kommandoer ved hjelp av en understreng, bruk apropos understreng
.
For å angi et bruddpunkt når programmet går inn i en funksjon, løpe:
$(gdb) break main
Her setter vi et bruddpunkt ved den eneste funksjonen i koden vår, dvs. hoved-
. Bruk kommandoen løpe
for å kjøre programmet til neste bruddpunkt, eller til avslutning.
$(gdb) kjøre
For å angi et bruddpunkt på et bestemt sted i en funksjon, bruk:
pause *hoved + 4
Dette vil sette opp et bruddpunkt på den fjerde linjen i hovedfunksjonen.
Nå, for å gå over programflyten til neste kodelinje, bare kjør steg
kommando.
$(gdb) trinn 5: float f = 5,5;
For å vise innholdet i en variabel, løpe vise
.
$(gdb) display i 6: i = 5
For å endre innholdet i en variabel, som kan være nødvendig for å analysere kjøringen av et program under spesifikke verdier av en variabel, kjøring sett variabel =Uttrykk
.
$(gdb) sett variabel i=10 $(gdb) display i 7: i = 10
Her kan "Uttrykket" være et hvilket som helst gyldig (aritmetisk / logisk) uttrykk. For enkelhets skyld tilordner vi bare en annen verdi (10) til variabel Jeg
.
For å skrive ut monteringskoden for programmet, bruk kommando demonter funksjonsnavn
:
Bruk bare demontere
for å skrive ut monteringskode for hele programmet. Legg merke til pilen på en bestemt linje i monteringskoden. Det angir at feilsøkingsøkten for øyeblikket er satt på pause på den spesielle minneplasseringen (dvs. den kodelinjen).
For å hoppe feilsøkeren til en bestemt linje med kode, løpe:
$(gdb) jump *main + 2 Fortsetter på 0x400528. Knekkpunkt 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å feilsøkeren til å hoppe til minneplasseringen til den andre kodelinjen i funksjon hoved-
. Merk at her hoppet jeg fra start av hoved til direkte andre plassering. Derfor variabel Jeg
ble aldri satt, noe som resulterer i at feilsøkeren får feilen at den ikke får tilgang til minneinnholdet på adressen til variabelen Jeg
.
Dette er noen av de grunnleggende kommandoene som kan hjelpe deg med å komme i gang med å feilsøke en kjørbar fil i Linux. Vi håper du finner informasjonen på denne siden nyttig.