Helsingin yliopisto Tietojenkäsittelytieteen laitos
 

Tietojenkäsittelytieteen laitos

Tietoa laitoksesta:

 

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:

  1. Käännä ohjelma käyttäen optiota -g.
  2. Käynnistä gdb.
  3. Aseta tarvittaessa pysäytyskohtia (breakpoint) tai anna muita tarvittavia komentoja.
  4. Käynnistä tutkittava ohjelma gdb:n sisällä.
  5. Kun ohjelma pysähtyy, anna tarvittavia komentoja, esimeriksi tutki tai muuta ohjelman muutujien arvoja tai aseta pysäytyskohtia.
  6. 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.


atk-apu@cs.Helsinki.FI