Esimerkki debuggerista.
**Debuggeri** eli **virheenjäljitin** on tietokoneohjelma, jota käytetään muiden tietokoneohjelmien ohjelmointivirheiden jäljittämiseen ja korjaamiseen. Virheenjäljittäjät ovat ohjelmoijien työkaluja, ja niitä käytetään yleisimmin silloin, kun ohjelman lähdekoodi on saatavilla. Virheen etsimistä kutsutaan yleisesti debuggaukseksi. Nykyisin debuggeri on usein integroitu osaksi ohjelmointiympäristöä.

Kuvaus
------

Virheenjäljittäjä antaa mahdollisuuden tarkastella tietokoneen ja tietokoneohjelman sisäistä tilaa ohjelman suorituksen aikana. Erilaiset virheenjäljittäjät antavat tarkasteluun erilaisia mahdollisuuksia riippuen tarkasteltavasta ohjelmasta ja ohjelman ajonaikaisista oikeustasoista. Virheenjäljittäjän käytön tarkoituksena on useimmiten selvittää ohjelmiston virheitä, mutta sitä voidaan käyttää myös ohjelmiston toiminnan yleiseen selvittämiseen ja takaisinmallinnukseen (eng. reverse engineering). Virheenjäljittäjää voidaan käyttää tällöin myös laittomiin tarkoituksiin, kuten kaupallisten ohjelmistojen kopiointisuojausten murtamiseen.

Usein debuggeria käytettäessä tutkittava ohjelma käännetään erityisillä asetuksilla joilla siihen lisätään tietoa virheiden jäljitystä varten. Näin debuggeri tietää minkä nimisestä lähdekoodin tiedostosta ja jopa miltä riviltä ajettava koodi on peräisin. Eräillä alustoilla ohjelma käännetään oletuksena debug-tiedon kanssa ja julkaistavasta versiosta poistetaan (*strip*) ylimääräiset jäljitystiedot.

Yksi virheenjäljittäjän perustoiminto on asettaa ohjelmiston ohjelmakoodiin kohta, jossa ohjelman suoritus pysäytetään (*breakpoint*) ja suoritus siirtyy virheenjäljittäjään. Siirtohetkellä virheenjäljittäjä tallentaa välittömästi ajonaikaisen suorituksen, muun muassa rekistereiden ja muistin tilan ja antaa ohjelmoijalle mahdollisuuden tutkia niiden sisältöä. Jos ohjelmaan on käännettäessä lisätty lisätietoa virheenjäljitystä varten voidaan muuttujia tarkastella niiden nimillä. Tiedoista on usein hyötyä ohjelman toiminnan tarkastamisessa ja virheiden selvittämisessä. 

Virheenjäljittäjillä voidaan jäljittää ohjelman suoritusta ja esimerkiksi paikallistaa kohta, jossa tietokoneohjelma kaatuu. Virheenjäljittäjissä voidaan ohjelman suoritusta seurata käsky käskyltä debuggerin käyttöliittymästä sekä lukea muuttujien ja olioiden sisältöä. Muistissa olevia tietoja voidaan paitsi lukea, myös usein muokata suoraan virheenjäljittäjästä. Virheenjäljittäjät tarjoavat usein tietokoneen ajonaikaiseen muistiin suoran näkymän. Lisäksi useimmat virheenjäljittäjät tarjoavat näkymän tietokoneen rekistereihin, pinoon, konekoodiin ja tietokoneohjelman lähdekoodiin, mikäli ohjelmisto on käännetty siten, että symbolitieto lähdekoodista on saatavilla. Useat debuggerit osaavat lukea ohjelman kaatumisen yhteydessä tallennettavia coredump-tiedostoja virheen jäljittämistä varten.

Käyttöjärjestelmän ytimen kanssa toimivilla debuggereilla, kuten SoftICE, voidaan tarkkailla kerneli- ja laiteajuritason suoritusta. Linux-ydin tukee kahta tapaa, *kdb* ja *kgdb*, joista jälkimmäinen on etänä kahdella tietokoneella suoritettava.

Virheenjäljittäjä soveltuu hyvin useimpien ohjelmistojen loogisten virheiden jäljittämiseen, koska se tarjoaa ohjelmiston suoritukseen ajonaikaisen näkymän. Sen avulla ei kuitenkaan voida jäljittää kaikentyyppisiä virheitä. Ongelmallisia ovat muun muassa virheet, joissa tutkittava ohjelma toimii yhteistyössä jonkun toisen samanaikaisesti joko toisessa prosessissa tai toisessa tietokoneessa toimivan järjestelmän kanssa. Virheenjäljittäjä ei voi pysäyttää toista järjestelmää tai säiettä, tai saada toista prosessia toimimaan ajan suhteen täysin samalla tavalla kuin virhetilanteen syntyessä. Reaaliaikajärjestelmät, kuten esimerkiksi auton ABS-järjestelmän ohjaus, ovat myös järjestelmiä, joiden toimintaa ei voida luotettavasti testata tavallisilla virheenjäljittäjillä.

Katso myös
----------

* Ohjelmointiympäristö

Lähteet
-------

1. ↑  Chapter 1. Introduction *kernel.org*. Viitattu 25.11.2017.

Kirjallisuutta
--------------

* Jonathan B. Rosenberg: *How Debuggers Work: Algorithms, Data Structures, and Architecture*. John Wiley & Sons, 1996. ISBN 0-471-14966-7. (englanniksi)
* Norman Matloff & Peter Jay Salzman: *The Art of Debugging with GDB, DDD, and Eclipse*. No Starch Press, 2008. ISBN 978-1-59327-174-9. (englanniksi)

Aiheesta muualla
----------------

* How debuggers work: Part 1 - Basics (englanniksi)
* How debuggers work: Part 2 - Breakpoints (englanniksi)
* How debuggers work: Part 3 - Debugging information (englanniksi)