Avlusing (debugging)

For å enklere kunne forstå hva programmet vårt gjør til enhver tid er det ofte praktisk å kjøre programmet i en avluser (debugger på engelsk). I en avluser kan vi overvåke hva programmet vårt gjør, ofte, helt ned til hva hvert enkelt register inneholder. Dette gjør det praktisk mulig å forstå hvorfor programmet vårt oppfører seg som det gjør og samtidig se hvilke kodelinjer som førte til oppførselen.

I dette faget skal vi benytte oss av GDB som er en av de eldste og mest omfattende avluserene som finnes. Uheldigvis for oss så har også GDB et av de eldste brukergrensesnittene (på godt og vondt), men det finnes heldigvis flere tredjeparts grensesnitt som vi kan benytte oss av. Et godt alternativ er gdbgui som kobler seg sammen med GDB og presenterer et moderne grensesnitt som burde fungere på de fleste datamaskiner.

Installasjon

GDB burde allerede være installert på din RPi, men hvis ikke så kan programmet installeres ved å kalle på følgende i et terminalvindu.

For å installere gdbgui kan vi kjøre følgende også i et terminalvindu.

Bruk

For å illustrere bruken av gdbgui kommer til å bruke et enkelt “tomt” program for å vise hovedmomentene som man må kunne. Følgende bilde illustrere programmet vi skal avluse.

Geany med programsnutt
Geany med programsnutt

Det neste vi trenger å gjøre er å konvertere programmet til maskinkode. Det kan gjøres med følgende instruksjon.

Legg merke til at du trenger å gjøre dette hver gang du gjør endringer i kildekode filen (i dette tilfellet filen part1.s).

For å starte avlusing kan vi kjøre følgende kommando (merk at -b chromium-browser bare trengs på RPi fordi to nettlesere er installert og den vanlige ikke støtter gdbgui).

Som burde gi følgende utskrift samt åpne nettleseren vår.

Terminalvindu med gdbgui
Terminalvindu med gdbgui

Du vil nå se at nettleseren åpner seg. Hvis du får beskjed om at nettleseren ikke klarer å koble til så burde det holde å vente litt og hvis ikke det skjer noe kan du prøve å laste siden på nytt (hvis ikke dette fungerer se seksjonen under om feilsøking). Neste bilde viser hvordan det burde se ut hvis alt har gått som det skal.

Gdbgui oppstartsskjerm
Gdbgui oppstartsskjerm

På bilde over kan vi se at gdbgui består av tre hovedelementer. På midten, til venstre, ser vi programmet vårt. På midten, til høyre, ser vi informasjon om tilstanden til maskinen. Og nederst ser vi tilstanden til GDB. Hvis vi ser øverst i høyre hjørne ser vi kontrollene som styrer GDB.

Når programmet starter opp slik som over vil det i hovedsak ikke gjøre så mye. Vi kan se på linje 7 i programvinduet at det er uthevet i blått. Dette indikerer at et stoppunkt (breakpoint på engelsk) er laget på linjen og programmet vårt vil stoppe på denne linjen. Når vi starter å avluse er det lurt å alltid plassere et stoppunkt tidlig slik at GDB ikke kjører for mange instruksjoner. Vi kan selv plassere stoppunkter ved å trykke på en linje slik at den blir uthevet i blått.

For å starte avlusing må vi første gang restarte programmet. I gdbgui gjøres dette ved å trykke på run markert i bildet under.

Gdbgui run
Gdbgui run

Du vil nå se at gdbgui arbeider litt før den lager en lys utheving på kjørende linje i programmet vårt. I bilde over burde du kunne se en lys utheving på linje 7.

Når du skal kjøre programmet ditt anbefaler vi at du kjører en linje om gangen. Dette kan gjøres ved å trykke på knappen uthevet i neste bilde eller trykke på , (komma-tasten). Da vil GDB kjøre en og en instruksjon for oss og vi kan veldig enkelt få en oversikt over hva som skjer.

Gdbgui step
Gdbgui step

Når du avluser programmet ditt så må du passe på to ting. Hvilken linje av programmet ditt kjøres og hva er tilstanden til maskinen. Det første punktet kan vi enkelt se i programvinduet til gdbgui med uthevet linje (ikke blå utheving). Mens det andre punktet må vi undersøke selv ved å åpne registers i tilstandsvinduet, illustrert i bilde under.

Gdbgui tilstandsvindu
Gdbgui tilstandsvindu

I bildet over legg også merke til at “nåværende programlinje” er 15.

Dette har vært en veldig enkel innføring i gdbgui vi anbefaler at du undersøker ytterligere egenskaper til gdbgui på egenhånd. Avlusing og GDB er veldig kraftige verktøy som man helt klart ser igjen som programmerer.

Feilsøking

Hvis gdbgui stopper og fungere kan det være nødvendig å avslutte GDB. Se først til at du har avsluttet alle gdbgui prosesser (sudo killall gdbgui) deretter kjør sudo killall gdb for å passe på at ingen GDB prosesser har blitt hengende igjen. Prøv å starte gdbgui på nytt.

Hvis ingen av stegene fungerer for deg ta kontakt med gruppelærere!