GDB - virheejäljitykseen
Unix-ympäristössä on yleensä useita virheenjäljittimiä (engl. debugger). Esimerkiksi Sun-järjestelmissä on käytössä ainakin adb, sdb ja dbx. Nämä on tarkoitettu erilaisille käyttäjille. Tässä käsitellään GNU-projektin virheenjäljitintä gdb, koska se toimii useissa käyttöjärjestelmissä.
Perinteinen virheenjäljitystapa on lisätä ohjelman koodiin ylimääräisiä tulostuslauseita, jotka tulostavat joidenkin muuttujien arvoja. Tämä on yleensä helppoa, mutta hidasta ja työlästä, koska ohjelmaa joutuu koko ajan muuttamaan ja kääntämään.
Virheenjäljitin antaa ohjelmoijan tutkia ja muuttaa ohjelmansa muuttujien arvoja sen suorituksen aikana, ilman että ohjelmaa itsessään tarvitsee muuttaa. Tällä tavoin vältetään hitaat kääntämiset, mikä nopeuttaa virheenjäljitystä huomattavasti. Virheenjäljitin voi lisäksi yleensä kertoa sellaistakin, mikä on ohjelman sisältä tai aputulostusten perusteella vaikeasti selvitettävissä, esimerkiksi aliohjelmien aktivaatiotietuepinon sisällön.
Käyttöliittymä
Unix-virheenjäljittimet ovat yleensä vähemmän näyttäviä ja helppokäyttöisiä kuin esimerkiksi Borlandin C-kääntäjään integroitu virheenjäljitin. On kuitenkin olemassa myös X-ikkunointijärjestelmälle (sekä GNU Emacsille) kirjoitettuja erillisiä käyttöliittymiä m.m. gdb:lle, jolloin käyttäminenkin on helpompaa. Emme kuitenkaan käsittele niitä tässä, vaan tyydymme normaaliin gdb:hen joka on aina samanlainen.Gdb on komentopohjainen. Tutkittava ohjelma käynnistetään ja sen suoritusta seurataan ja ohjataan tekstinä annettavilla komennoilla, joita voi tosin antaa vain kun ohjelma on pysähtynyt. Gdb:n käyttäminen on siis seuraavanlaista:
- Käännä ohjelma käyttäen optiota -g.
- Käynnistä gdb.
- Aseta tarvittaessa pysäytyskohtia (breakpoint) tai anna muita tarvittavia komentoja.
- Käynnistä tutkittava ohjelma gdb:n sisällä.
- Kun ohjelma pysähtyy, anna tarvittavia komentoja, esimeriksi tutki tai muuta ohjelman muutujien arvoja tai aseta pysäytyskohtia.
- Jatka sen jälkeen ohjelman suoritusta erillisellä komennolla, tai lopeta gdb.
Komentoja
Tärkeimmät komennot ovat:- run komentoriviargumentit
- Käynnistä ohjelma alusta, välittäen annetut argumentit sille aivan kuin
ne olisi annettu ohjelmalle komentoriviltä.
- quit
- Lopeta gdb.
- where
- Näytä aktivaatiotietuepino (stack). Listasta näkyy m.m. nykyinen funktio
ja sen kutsuja ja kutsujan kutsuja jne. aina pääohjelmaan saakka. Jokaisesta
funktiosta näkyy myös lähdekoodirivi:
(gdb) where #0 0xd9c0 in __read () #1 0x400 in sort_database (db=0x25000) at tool.c:91 #2 0xa505 in _IO_file_underflow (fp=0x25000) at fileops.c:285 #3 0x5dc0 in __underflow (fp=0x25000) at genops.c:234 #4 0xadb8 in _IO_getline (fp=0x25000, buf=0xf1980 "Description: GNU Revision Contrtem (RCS)", n=96, delim=10, extract_delim=1) at iogetline.c:50 #5 0xac4b in _IO_fgets (buf=0xf1980 "Description: GNU Revision Contrtem (RCS)", n=128, fp=0x25000) at iofgets.c:38 #6 0x3a94 in getaline (f=0x25000) at /home/wirzeniu/p/publib/publib/publib/modules/files /getaline.c:40 #7 0x22c9 in lsm_read_one_entry (f=0x25000, lineno=0xbfff81f4, e=0x50200) at lsm.c:137 #8 0x25d8 in lsm_read_database (f=0x25000, db=0x1ba14) at lsm.c:235 #9 0x152e in main (argc=2, argv=0xbffffa3c) at tool.c:626 (gdb)
On huomattava, että where näyttää myös kirjastoaliohjelmat ja muut kielen toteutukseen liittyvät aliohjelmat, koska ne näyttävät käännetyssä ja linkatussa ohjelmassa näyttävät samanlaisilta kuin tavalliset aliohjelmat.
- list [paikka]
- Näytä ohjelman lähdekoodia. Ilman parametria jatkaa edellisen komennon
jälkeistä listausta; parametri "-" listaa taaksepäin. Paikka voi
myös olla rivinumero (listaus sen rivinumeron ympäriltä) tai kaksi pilkulla
erotettua rivinumeroa (listaus ensimmäisestä rivistä viimeiseen). Rivinumero
voi kertoa myös funktion (ftio) tai lähdekooditiedoston (tdsto:rivinro tai
tdsto:ftio).
- break paikka
- Aseta pysäytyskohta annettuun paikkaan, jolloin ohjelman suoritus
pysähtyy, kun se tulee pysäytyskohtaan. Paikka voi olla rivinumero
(rivinro tai tdsto:rivinro) tai funktion nimi (jolloin suoritus pysähtyy
kun funktiota kutsutaan; break main pysäyttää ohjelman suorituksen
heti pääohjelman alkuun).
Pysäytyskohtia voi poistaa komennolla delete.
- print lauseke
- Tulosta lausekkeen arvo. Lausekkeessa voi käyttää senhetkisen
aktivaatiotietueen mukaisia muuttujia ja globaaleja muuttujia. Syntaksi
on kuten C:ssä.
- continue
- Jatkaa pysähtyneen ohjelman suoritusta, esimerkiksi pysäytyskohdan
jälkeen.
- step [lkm]
- Jatka ohjelman suoritusta yhden tai lkm askelta. Mikäli suoritettavalla
rivillä on aliohjelmakutsuja, step askeltaa niiden sisälläkin
rivin kerrallaan.
- next [lkm]
- Jatka ohjelman suoritusta yhden tai lkm askelta. Suorita aliohjelmakutsut
suoraan, älä askella niiden sisälle.
- finish
- Suorita ohjelmaa nykyisen aliohjelman loppuun.
- help
- Kertoo tarkemmin ohjelman komennoista.