GNU Debugger används för att felsöka ett program, för att analysera kraschar eller för att se vad programmet gör vid en viss punkt. Den utvecklades av GNU-projektet på 1980-talet och har varit en av de mest använda kommandoradsfelsökningarna samt en av de mest populära GNU-mjukvarana.
Låt oss först skriva ett litet C-program som vi sedan ska felsöka. För att komma igång, skapa en ny .c
fil med hjälp av vim
eller valfri redaktör:
vim test.c
Skapa följande C-program:
#include int main() { int i = 5; float f = 5,5 i = i + 3; f = f + 2,2; printf("Värdet på i och f är: %d och %f\n", i, f); returnera 0; }
Tryck Fly
för att gå till vim kommandoläge. Skriv sedan :wq
för att spara programmet och avsluta.
Kompilera och se om programmet körs:
gcc test.c -o test ./test Värdet på i och f är: 8 och 7,700000
För att aktivera felsökningsstöd i ett program, vi sammanställer det med -g
flagga. Om flaggan inte används kan användaren fortfarande felsöka programmet, om än med begränsade alternativ.
gcc test.c -g -o test
För att börja felsöka vår körbara fil testa
i gdb
, vi springer:
gdb test
Det kommer att öppna gdb
konsol, där du kan skriva gdb
kommandon. För att se en lista med kommandon använd hjälp
kommando.
$(gdb) hjälp Lista över klasser av kommandon: alias -- Alias för andra kommandon brytpunkter -- Få programmet att stanna vid vissa punkter data -- Undersöka datafiler -- Specificera och undersöka filer interna -- Underhållskommandon obskyra -- Obskyra funktioner som körs -- Köra programstacken -- Undersöka stackens status -- Statusförfrågningar stöd -- Supportfaciliteter spårpunkter -- Spårning av programexekvering utan att stoppa programmet användardefinierade -- Användardefinierade kommandon Skriv "hjälp" följt av ett klassnamn för en lista över kommandon i den klassen. Skriv "hjälp alla" för listan över alla kommandon. Skriv "hjälp" följt av kommandonamn för fullständig dokumentation. Skriv "apropos ord" för att söka efter kommandon relaterade till "ord". Kommandonamnsförkortningar är tillåtna om de är entydiga.
Du kan sedan skriva hjälp class_name
för att se kommandon som tillhör den klassen. För att söka efter kommandon med en delsträng, använd apropos delsträng
.
För att ställa in en brytpunkt när programmet går in i en funktion, springa:
$(gdb) break main
Här sätter vi en brytpunkt vid den enda funktionen i vår kod, d.v.s. huvud
. Använd kommandot springa
för att köra programmet till nästa brytpunkt, eller tills avsluta.
$(gdb) kör
För att ställa in en brytpunkt på en viss plats i en funktion, använda sig av:
break *main + 4
Detta kommer att ställa in en brytpunkt på den fjärde raden i funktionshuvudet.
Nu, för att stega över programflödet till nästa kodrad, kör helt enkelt steg
kommando.
$(gdb) steg 5: float f = 5,5;
För att visa innehållet i en variabel, springa visa
.
$(gdb) display i 6: i = 5
För att ändra innehållet i en variabel, som kan krävas för att analysera körningen av ett program under specifika värden för en variabel, körning set variabel =Uttryck
.
$(gdb) set variabel i=10 $(gdb) display i 7: i = 10
Här kan "Uttrycket" vara vilket giltigt (aritmetiskt / logiskt) uttryck som helst. För enkelhetens skull tilldelar vi bara ett annat värde (10) till variabel i
.
För att skriva ut monteringskoden för programmet, använd kommandot demontera funktionsnamn
:
Använd bara ta isär
för att skriva ut monteringskoden för hela programmet. Notera pilen på en viss rad i monteringskoden. Det anger att felsökningssessionen för närvarande är pausad vid den specifika minnesplatsen (dvs den kodraden).
För att hoppa felsökaren vid en viss kodrad, springa:
$(gdb) jump *main + 2 Fortsätter på 0x400528. Brytpunkt 2, 0x000000000040052a i main () vid test.c:3 3 int main() { 1: i = 2: f = 3: h = (void *) 0x0 4: main = {int ()} 0x400526 5: i =
Detta kommer att få felsökaren att hoppa till minnesplatsen för den andra kodraden i funktion huvud
. Observera att jag här hoppade från start av huvud till direkt andra plats. Alltså varierande i
har aldrig ställts in, vilket resulterar i att felsökaren får felet att den inte kan komma åt minnesinnehållet på adressen till variabeln i
.
Det här är några av de grundläggande kommandona som kan hjälpa dig att komma igång med att felsöka en körbar fil i Linux. Vi hoppas att du tycker att informationen på den här sidan är användbar.