Avlusing
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](oblig2_bilder/geany.png)
Det neste vi trenger å gjøre er å konvertere programmet til maskinkode. Det kan gjøres med følgende instruksjon.
For å starte avlusing kan vi kjøre følgende kommando.
Som burde gi følgende utskrift samt åpne nettleseren vår.
![Terminalvindu med gdbgui](oblig2_bilder/run.png)
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](oblig2_bilder/first_screen.png)
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](oblig2_bilder/reload_program.png)
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](oblig2_bilder/step_program.png)
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](oblig2_bilder/inspect2.png)
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!