Hoe GNU Debugger in Linux te gebruiken

GNU Debugger wordt gebruikt om een ​​programma te debuggen, crashes te analyseren of om te zien wat het programma op een bepaald punt doet. Het werd in de jaren 80 ontwikkeld door het GNU-project en is een van de meest gebruikte debuggers op de opdrachtregel en een van de meest populaire GNU-software.

Laten we eerst een klein C-programma schrijven dat we dan gaan debuggen. Maak om te beginnen een nieuwe .C bestand met behulp van vim of een editor naar keuze:

vim test.c

Maak het volgende C-programma:

#include int main() { int i = 5; vlotter f = 5,5 i = i + 3; f = f + 2,2; printf("Waarde van i en f zijn: %d en %f\n", i, f); retourneer 0; }

druk op Ontsnappen om naar de vim-opdrachtmodus te gaan. Typ vervolgens :wq om het programma op te slaan en af ​​te sluiten.

Compileer en kijk of het programma draait:

gcc test.c -o test ./test Waarde van i en f zijn: 8 en 7.700000

Om foutopsporingsondersteuning in een programma in te schakelen, we compileren het met -G vlag. Als de vlag niet wordt gebruikt, kan de gebruiker nog steeds fouten in het programma debuggen, zij het met beperkte opties.

gcc test.c -g -o test

Om te beginnen met debuggen ons uitvoerbare bestand test in gdb, wij rennen:

gdb-test

Het zal de . openen gdb console, waar u de . kunt typen gdb commando's. Gebruik de om een ​​lijst met opdrachten te zien helpen opdracht.

$(gdb) help Lijst met klassen van commando's: aliassen -- Aliassen van breekpunten van andere commando's -- Programma laten stoppen op bepaalde datapunten -- Gegevensbestanden onderzoeken -- Interne bestanden specificeren en onderzoeken -- Onderhoudscommando's onduidelijk -- Obscure functies actief -- De programmastack uitvoeren -- De stapelstatus onderzoeken -- Ondersteuning voor statusaanvragen -- Traceringspunten van ondersteuningsfaciliteiten -- Traceren van de uitvoering van het programma zonder het programma te stoppen door de gebruiker gedefinieerd -- Door de gebruiker gedefinieerde opdrachten Typ "help" gevolgd door een klassenaam voor een lijst met opdrachten in die klasse. Typ "help all" voor de lijst met alle commando's. Typ "help" gevolgd door de opdrachtnaam voor volledige documentatie. Typ "apropos word" om te zoeken naar commando's gerelateerd aan "word". Afkortingen van opdrachtnamen zijn toegestaan ​​indien ondubbelzinnig.

U kunt dan typen help class_name om opdrachten te zien die bij die klasse horen. Om commando's te zoeken met een substring, gebruik passende subtekenreeks.

Om een ​​onderbrekingspunt in te stellen wanneer het programma een functie binnengaat, loop:

$(gdb) hoofdonderbreking

Hier stellen we een breekpunt in op de enige functie in onze code, d.w.z. voornaamst. Gebruik het commando loop om het programma uit te voeren tot het volgende breekpunt, of tot het afsluiten.

$(gdb) uitvoeren

Om een ​​breekpunt op een bepaalde locatie in een functie in te stellen, gebruiken:

pauze *hoofd + 4

Hiermee wordt een breekpunt ingesteld op de 4e regel van de functie main.

Nutsvoorzieningen, om over de programmastroom naar de volgende coderegel te stappen, voer gewoon de stap opdracht.

$(gdb) stap 5: float f = 5.5;

Om de inhoud van een variabele weer te geven, loop Scherm .

$(gdb) weergave i 6: i = 5

Om de inhoud van een variabele te wijzigen, die nodig kan zijn om de uitvoering van een programma onder specifieke waarden van een variabele te analyseren, run variabele instellen =Expressie.

$(gdb) set variabele i=10 $(gdb) display i 7: i = 10

Hier kan de 'Uitdrukking' elke geldige (rekenkundige / logische) uitdrukking zijn. Voor de eenvoud kennen we gewoon een andere waarde (10) toe aan variabele I.

Om de montagecode voor het programma af te drukken, gebruik commando functienaam demonteren:

Gebruik gewoon demonteren om de montagecode voor het hele programma af te drukken. Let op de pijl bij een bepaalde regel in de montagecode. Het geeft aan dat de foutopsporingssessie momenteel is gepauzeerd op die specifieke geheugenlocatie (d.w.z. die regel code).

Om de debugger naar een bepaalde regel code te springen, loop:

$(gdb) jump *main + 2 Vervolg op 0x400528. Breekpunt 2, 0x000000000040052a in main () bij test.c:3 3 int main() { 1: i = 2: f = 3: h = (void *) 0x0 4: main = {int ()} 0x400526 5: i = 

Hierdoor springt de debugger naar de geheugenlocatie van de 2e regel code in functie voornaamst. Merk op dat ik hier van het begin van de hoofdlocatie naar de direct tweede locatie ben gesprongen. Vandaar, variabel I is nooit ingesteld, wat resulteert in de foutopsporingsfout dat het geen toegang heeft tot de geheugeninhoud op het adres van de variabele I.

Dit zijn enkele van de basiscommando's die u kunnen helpen om aan de slag te gaan met het debuggen van een uitvoerbaar bestand in Linux. We hopen dat u de informatie op deze pagina nuttig vindt.