16c. Debugging

2021-04-16
slides.com/jod/pt_16c

Docent: Jo Devriendt

Assistent: Ann Philips

Coördinator: Joost Vennekens

voornaam.achternaam@kuleuven.be

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

  • NASA's Spirit rover became unresponsive on January 21, 2004, a few weeks after landing on Mars. Engineers found that too many files had accumulated in the rover's flash memory. It was restored to working condition after deleting unnecessary files.
  • A bug in the code controlling the Therac-25 radiation therapy machine was directly responsible for at least five patient deaths in the 1980s when it administered excessive quantities of beta radiation.
  • Smart ship USS Yorktown was left dead in the water in 1997 for nearly 3 hours after a divide by zero error.
  • Boeing 737 NG had all cockpit displays go blank if a specific type of instrument approach to one of seven specific airports was selected in the flight management computer.

Enkele voorbeelden

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Waar komt "bug" vandaan?

https://en.wikipedia.org/wiki/Software_bug

  • 1946. Grace Hopper vindt een mot in een relais als oorzaak voor een probleem met de Harvard Mark II, noemt het "First actual case of bug being found".
  • "Bug" bestond al als woord voor "technisch probleem".

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Soorten bugs

  • Conceptuele bug / designfout
    • gekozen algoritme werkt niet voor alle input, gekozen databanksysteem kan type queries niet aan, ...
  • Compiletime / statisch
    • syntaxfouten, typefouten, ontbrekende includes, ...
  • Runtime / dynamisch
    • geheugenbugs, off-by-one errors, oneindige loops, numerieke overflows, out-of-bounds indices, ...

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Debugprocedure

Isoleer de bug

  • Minimaal stukje code waarin het probleem opduikt
  • "verdeel en heers" door het programma steeds verder op te splitsen
  • Vaak niet makkelijk!

Reproduceer de bug in betrouwbare mate

  • Bevestiging dat er inderdaad iets aan de hand is ...
  • ... maar soms doet de bug zich enkel sporadisch voor
  • Ook: maak meteen een unittest / integratietest

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Debugprocedure

Analyseer het gedrag van de code waar de bug opduikt

  • Klassiek: zet strategische print-statements die de toestand van het programma tijdens uitvoeren duidelijk maken
  • Beter: gebruik debuggers, bvb. gdb
    • laten toe om stap per stap een programma uit te voeren
    • laten toe om de call stack en waardes van variabelen te inspecteren
  • En andere tools, bvb. de geheugentester valgrind

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Debugprocedure

Creëer steeds verfijndere hypotheses van wat er misloopt

  • Bvb. "Is deze pointer misschien NULL?" "Ja!" "Hmm, maar waarom? Omdat deze lus hier voortijdig eindigt?" etc.
  • Ook: "Wolf fence" aanpak (Edward Gauss)

    There's one wolf in Alaska; how do you find it? First build a fence down the middle of the state, wait for the wolf to howl, determine which side of the fence it is on. Repeat process on that side only, until you get to the point where you can see the wolf.

    Hypothese begint triviaal, en door op zoek te gaan naar waar het programma zich fout gedraagt en waar niet vind je uiteindelijk de oorzaak.

Tijdens debuggen ben je tegelijkertijd
de detective, de dader, en het slachtoffer.

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Psychologie

  • Bugs voelen slecht: je hebt een fout gemaakt.
  • Dit is niet waar! Bugs zijn het onvermijdbare gevolg van code schrijven. Enkel wie geen code schrijft, maakt geen bugs.
  • Slechtgeteste code is wél een fout.

 

  • Bij het debuggen zelf zal het soms lijken alsof je alles juist gedaan hebt, maar het toch niet werkt.
  • In 99% van die gevallen heb je toch zelf een fout gemaakt.
    • Je begrijpt alleen nog niet welke fout
    • Oplossing voor onbegrip: bijleren, door programma te analyseren of door hulp in te roepen

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Rubber duck debugging

https://en.wikipedia.org/wiki/Rubber_duck_debugging

  • Leg je bug zo helder mogelijk uit aan iemand anders
    • maakt niet uit wie, een rubberen eend werkt ook
  • "Uitleggen" vereist een ander perspectief, wat tot nieuw inzicht leidt, en verrassend vaak tot een eurekamoment waar je de oorzaak van de bug vindt
  • Ook: staar je niet blind op een bug. Als je het na uren zoeken niet vindt, doe iets anders, en probeer de volgende dag opnieuw

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Samenvatting

  • Conceptuele bug, compiletime error, runtime error
  • Reproduceer, Isoleer, Analyseer, Toets hypotheses af
  • Wees je bewust van de psychologie achter debuggen
  • Ga nog eens rubberen eendjes vissen