Debuggen

Naarmate je meer ervaren raakt als programmeur, kun je een reeks aan hulpmiddelen inzetten om fouten in je code te identificeren en verhelpen, zoals een debugger, unit testing, of traceer software.

Als je leert programmeren, heb je hier echter nog geen beschikking over terwijl je waarschijnlijk juist nu tegen een reeks foutmeldingen aan gaat lopen. We geven je daarom enkele handvaten om je te helpen bij het debuggen ofwel het opsporen en verhelpen van fout in je eerste programma's.

Test vaak

Het is eigenlijk niet mogelijk om je programma te vaak te testen door tussentijds de code uit te voeren. Doe dat dus na een serieuze wijziging! Daarbij krijg je iedere keer dat je het programma uitvoert feedback of het werkt en je dus de goede kant op gaat of dat er plotseling fouten optreden.

Test je regelmatig, dan is het makkelijker om na te gaan waar een fout geïntroduceerd is: ergens in de aanpasingen na de vorige succesvolle test.

Fout vinden

Is het niet direct duidelijk waar de fout precies zit, dan kunnen onderstaande technieken helpen om de fout te lokaliseren.

Print debugging

In principe zou je bij iedere lijn code moeten weten welke waardes je variabelen op dat moment hebben. Zie je andere waardes terug na het uitvoeren van het programma, dan kan het helpen om na te gaan op welk punt in de code de variabelen onverwachte waardes aannemen.

Een makkelijke manier om dit te doen is deze waardes tussendoor weer te laten geven, zoals in het voorbeeld hieronder. Wijken deze op een punt af van wat je zou verwachten, dan heb je waarschijnlijk de fout gevonden.

Uitcommentariëren

Door een gedeelte van je code in commentaar te plaatsen, worden deze regels tijdelijk niet meer uitgevoerd. Je kunt zo systematisch bepaalde stukken code 'uitschakelen' om te zien of daarmee de fout verdwijnt. Is dat zo, dan is de fout waarschijnlijk te vinden in het gedeelte van de broncode dat je uitgecommentariëerd hebt.

Git bisect

Wanneer er een eerdere werkende versie van je code bestaat en je git gebruikt, kun je het commando git bisect gebruiken om exact te bepalen welke commit de fout geïntroduceerd heeft. Je test hiermee meerdere keren een versie van je programma midden tussen de meest recent geteste 'goede' en 'foute' versies waardoor je steeds verder inzoomt en uiteindelijk precies weet welke commit de fout veroorzaakt heeft.

Zie voor details de documentatie van git.

Lees de foutmelding

In veel gevallen merk je een fout op doordat je een foutmelding krijgt. Doorloop de volgende stappen bij het lezen van een foutmelding, waarbij de exacte details verschillen per taal en je niet altijd al deze informatie krijgt.

  1. Ga na in welke bestand en op welke lijn volgens de foutmelding de fout optreedt. Kijk daarbij niet alleen op die lijn maar ook één of meerdere daarvoor
  2. Kijk om wat voor type fout het gaat, zoals een syntax-, geheugen- of delen-door-nul fout, zodat je een indicatie hebt van wat het probleem is
  3. Neem de verdere details van de foutmelding door
  4. Heb je al deze informatie doorgenomen, denk dan vervolgens logisch na!

Mocht je er niet uitkomen omdat je niet scherp hebt wat de foutmelding inhoudt, dan kan het zinnig zijn om online op (een gedeelte van) de melding te zoeken. Vaak vind je dan een toelichting bij de foutmelding waardoor je beter kunt plaatsen wat er misgaat.

Ter illustratie, met de onderstaande Python code zou je een woordenboek willen maken en printen:

data = ("Name":"John", "Surname":"Smith")
print (data)

Wanneer je het echter uitvoert, krijg je de volgende foutmelding:

File "classmates.py", line 1
data = ("Name":"John", "Surname":"Smith")
              ^
SyntaxError: invalid syntax

Aan de hand van de hiervoor beschreven stappen lees je deze foutmelding als volgt:

  1. Het probleem zit in de eerste lijn van classmates.py
  2. Het gaat om een SyntaxError, je volgt hier dus niet correct de 'taalregels' van Python
  3. Je hebt hier inderdaad een 'invalid syntax', waarbij de pijl behulpzaam wijst naar de dubbele punt
  4. Je maakt hier een tupel en dat is prima, maar na het eerste item ("Name") zou hier een komma moeten staan voor het tweede item in plaats van een dubbele punt. De interpreter geeft aan dat je in de Python syntaxis geen dubbele punt kunt gebruiken tussen deze haakjes

Zoek online

Als je niet uit de foutmelding komt of inspiratie nodig hebt voor jouw oplossing, biedt het internet vaak de uitkomt.

Je kunt dit doen door naar de meest zeggende (meestal laatste) regel van de foutmelding in een zoekmachine te zoeken en te kijken of dit je naar de juiste documentatie leidt. In het voorgaande Python voorbeeld zou dat 'SyntaxError: invalid syntax' zijn, waarbij je deze behulpzame resultaten vindt.

Daarnaast kun je rechtstreeks in Stack overflow zoeken. De kans is aardig dat je daar tijdens je zoektocht uit gaat komen.

Wees daarbij terughoudend met zelf je probleem op Stack overflow te plaatsen in de hoop dat het door meer ervaren programmeurs opgelost wordt. Op die manier leer jij jezelf niet om dit soort problemen zelf op te lossen terwijl dat juist is wat je in deze fase van je opleiding onder de knie wilt krijgen!

Rubber ducking

Heb je alles hierboven geprobeerd en lijkt dat niet te helpen, pak dan een voorwerp zoals een rubber eendje of een huisdier en doe hiermee het volgende:

  1. Leg uit wat je met je code probeert te doen, desnoods lijn voor lijn
  2. Wijs zo exact mogelijk het stuk code aan dat de fout veroorzaakt
  3. Neem samen de stack trace door, inclusief de foutmelding
  4. Leg twee à drie potentiële oplossingen uit die je al geprobeerd hebt en waarom deze niet werken

Door het probleem op deze manier aan een 'ander' uit te leggen, verhoog je de kans dat je zelf opeens een oplossing ziet. Daarbij is een groot voordeel van rubber duck debugging dat je andere niet hoeft te onderbreken (en je rubbere eendje heeft altijd tijd voor je).

Vraag assistentie

Lukt het nog steeds niet, dan kun je natuurlijk een assistent om hulp vragen. Op dit punt zou je scherp moeten kunnen formuleren wat het probleem is waar je tegenaan loopt en kan de assistent je hopelijk dus snel weer op weg helpen!

Bronnen

Deze tekst is gebasseerd op de presentatie 'Quick guide on debugging: How to Troubleshoot and Fix Your Code Without Pulling Your Hair Out' door Jurre Brandsen voor de cursus Programmeertalen in 2020.