T-106.1212 Grundkurs i programmering

Användning av debuggern

Inledning: att utföra programmet stegvis

Ofta finns det situationer då det är nyttigt att kunna utföra ett program steg för steg, för att man mellan stegen kan analysera programmets tillstånd (variablernas värden). Till exempel:

Stegvis exekvering skulle alltså vara praktiskt. Hur kan man göra det? En trivial lösning är att placera utskriftskommandon (t.ex. print) i programmet, så att variablers värden med jämna mellanrum skrivs ut på skärmen. När du sedan kör programmet får du en lång lista med "debug-utskrifter" med vars hjälp du försöker fastställa vad som händer i programmet (och var det kanske går fel).

Utskriftskommandon är dock ganska jobbiga. De måste skrivas överallt, det tar tid att formulera utskriften och till och med bra utskrifter är svåra att tolka. Dessutom måste man se till att den här debug-utskriften inte syns när man ger programmet till användaren.

Väldigt ofta skulle det vara mer praktiskt om man kunde inspektera programmets tillstånd utan att ändra på koden...

Debuggern

En debugger är ett hjälpprogram, med vilken man kan analysera andra program steg för steg. Det erbjuder funktioner för att utföra enskilda rader eller kommandon, och kan visa variablernas värden i olika skeden av programmet. Debuggern kan vara ett skilt program eller vara integrerat i utvecklingsmiljön. I Eclipse (närmare bestämt Pydev) finns en Python-debugger.

Man kan börja inspektera programmet stegvis ända från början eller från en punkt i programmet som man själv bestämmer. Stället där man börjar göra detta kallas för en brytningspunkt eller breakpoint. Debuggerns användare placerar brytningspunkten före han börjar debugga.

Debuggervideon

Den finska kursen har videon som lär en använda debuggern, dock endast på finska.

Video: Virheiden etsintä (Eclipsen debuggerilla), osat 1-3

Undersökning av startmetoden med debuggern i Eclipse

Låt oss analysera ett litet program som enbart har en huvudprogram. I Eclipse analyserar man program i debuggern på följande vis.

  1. Placera en breakpoint på den rad i koden där du vill att debuggern ska pausa programmet. Lägger du breakpointen på den första raden i kodfilen, undersöker du hela programmet ända från början. Du lägger en breakpoint genom att högerklicka på den gråa balken eller radnumret till vänster om den önskade raden och genom att välja Toggle Breakpoint. (Du får bort breakpointen senare med samma procedur.)



  2. Börja debugga genom att klicka på den lilla knappen med en insekt på i aktivitetsbalken eller välj Debug As -> Python Run, endera i Run-menyn i Eclipse eller genom att högerklicka på modulen i Package Explorern. Eclipse byter då från det normala s.k. Pydev-perspektivet till ett Debug-perspektiv. I praktiken betyder det att det kommer lite olika fönster och flikar än förut.



  3. I Debug-perspektivet är den kodrad som skall utföras till näst färgad grön. Genom att välja Run -> Step Over eller genom att trycka på F6-knappen utförs raden och programmet går till nästa rad. Genom att upprepa denna procedur kan man steg för steg gå igenom hela programmet.



  4. Variablernas värden visas i Variables-fliken när du är i Debug-perspektivet, i Eclipse-fönstret övre högra hörn. Variablerna förändras då kommandona i programmet placerar nya värden i dem.

Debuggningen kan avbrytas genom att klicka på den röda "stop-knappen" eller i Run-menyn. Du kommer tillbaka till det normala Pydev-perspektivet genom att välja "Pydev" i Eclipse-fönstrets övre högra hörn.

Undersökning av metodanrop med debuggern i Eclipse

I allmänhet innehåller ett program mera än bara ett huvudprogram och metoderna kan anropa varandra hur som helst. Om du utför en kodrad i debuggern som anropar en metod och trycker F6 (Step Over), kommer metodanropet nog att utföras, men du ser inte vad som händer i debuggern utan du kommer bara till nästa rad. Om du däremot trycker F5 (Step Into), fortsätter debuggern inne i metoden och du kan se vad som händer. När metoden har kört klart kommer du tillbaka där du började, som om du hade tryckt F6.

Undersökning av grafiska gränssnitt med debuggern i Eclipse

I många applikationer som har ett grafiskt gränssnitt, finns en väldigt simpel startmetod som helt enkelt kör igång det grafiska fönstret på rutan. Sedan verkar det som om programmet inte gör något mera, även om fönstret fungerar. Programmet har nämligen delats upp i flera s.k. trådar som utförs parallellt. Startmetoden är i en tråd och fönstret i en annan tråd.

På grund av detta är det oftast lönlöst att undersöka en sådan här startmetod med debuggern. Oftast är vi i dessa fall intresserade av vad som händer när det händer någonting i användargränssnittet (t.ex. om användaren klickar på någon knapp), d.v.s. hur händelsens hanteringsmetod fungerar internt. Du kommer åt detta genom att placera en breakpoint i händelsehanteraren (t.ex. i en buttonClicked-metod). När nu användaren klickar på knappen, anropas händelsehanteraren som vanligt, breakpointen påträffas och du kan börja debugga.