Hoe een C of C ++ programma op Linux te debuggen met behulp van gdb
Het normale proces voor het ontwikkelen van computerprogramma's gaat ongeveer als volgt: schrijf wat code, compileer de code, voer het programma uit. Als het programma niet werkt zoals verwacht, ga je terug naar de code om fouten te zoeken (bugs) en herhaal je de cyclus opnieuw.
Afhankelijk van de complexiteit van het programma en de aard van de bugs, zijn er momenten waarop je wat extra hulp kunt gebruiken bij het opsporen van de fouten. Dit is wat een "debugger" doet. Hiermee kunt u een computerprogramma bekijken terwijl het wordt uitgevoerd. U kunt de waarden van de verschillende variabelen bekijken, u kunt de inhoud van het geheugen bekijken en u kunt het programma op een bepaald punt stoppen en de code één regel tegelijk doorlopen.
De primaire foutopsporing op Linux is de GNU-foutopsporing (gdb). Het kan al op je systeem zijn geïnstalleerd (of een afgeslankte versie met de naam gdb-minimal), maar om zeker te zijn typ je de volgende opdracht in een terminal:
sudo apt-get install gdb
Om de debugger te gebruiken, moet u de compiler vertellen om foutopsporingsinformatie in het binaire bestand op te nemen. Maak een bestand met de naam "hello10.c" met behulp van nano:
nano hello10.c
Kopieer en plak de volgende code:
#include main () {int i; voor (i = 0; i <10; i ++) printf ("% d", i); }
De "-g" vlag vertelt de compiler om debug informatie te produceren, dus om het gebruik van het programma te compileren:
gcc -g -o hello10 hello10.c
Om het type fout te debuggen:
gdb hello10
Als u nu net begint met het uitvoeren van het programma (met behulp van de opdracht "run"), wordt het programma uitgevoerd en beëindigd voordat u de kans krijgt om iets te doen. Om dat te voorkomen, moet u een "breekpunt" maken dat het programma op een bepaald punt zal stoppen. De eenvoudigste manier om dit te doen is om de debugger te laten stoppen in de functie "main ()":
breek main
Start nu het programma:
rennen
De debugger is gestopt bij de eerste uitvoerbare coderegel, bijv. De "voor" -lus. Om naar de volgende regel te gaan, typt u "volgende" of "n" kort. Blijf "volgende" gebruiken om een paar keer rond de lus te herhalen:
Gebruik de opdracht "afdrukken" om de waarde van een variabele te controleren. In ons voorbeeldprogramma kunnen we de inhoud van de variabele "i" bekijken:
afdrukken i
Herhaal dit rond de lus en nog een paar keer en zie hoe "i" verandert:
volgende volgende volgende volgende print i
In het bovenstaande voorbeeld heeft "i" de waarde 4 bereikt. De lus zal doorgaan terwijl "i" kleiner is dan 10. U kunt de waarde van een variabele wijzigen met "set var." Typ het volgende in gdb om "i" in te stellen op 10.
stel var i = 10 print i next in
Mogelijk moet u nog een "volgende" doen (afhankelijk van waar het programma werd gestopt toen u "i" instelde op 10), maar wanneer de "voor" luslijn vervolgens wordt uitgevoerd, zal de lus worden afgesloten, omdat "i" niet is langer dan 10.
De "volgende" opdracht boort niet naar functies, maar de functie wordt uitgevoerd en de foutopsporing stopt weer op de volgende regel na de functie. Als u in een functie wilt stappen, gebruikt u de opdracht "step" of "s" kort.
Een andere manier om uw programma te debuggen, is door een variabele in te stellen. Wat dit doet, stopt het programma telkens wanneer de variabele verandert. Start het programma opnieuw door 'run' in te voeren. Aangezien het programma al wordt uitgevoerd, zal de debugger vragen of u het vanaf het begin opnieuw wilt starten.
Het programma stopt in hoofdzaak (omdat we het breekpunt niet hebben verwijderd). Zet nu een horloge op "i":
kijk ik ga door
Met de opdracht "Doorgaan" wordt het programma opnieuw gestart tot de volgende breekpuntvoorwaarde. In dit geval wordt het opnieuw uitgevoerd totdat de variabele "i" verandert (vanwege het horloge).
Gebruik de opdracht "quit" om het debuggen te stoppen.
Als u meer wilt weten over gdb, dan is een goede plaats om te beginnen de GDB-documentatie. Als u problemen ondervindt met de bovenstaande voorbeelden, gebruik dan de opmerkingen hieronder en we zullen zien of we u kunnen helpen.