**Debuggaus** eli **virheenjäljitys** on ohjelmistotuotannon osa, jossa testauksessa löytyneen virheellisen toiminnan aiheuttanut virhe paikallistetaan. Virheenjäljitykseen voidaan käyttää apuna debuggeria. Termiä käytetään usein virheellisesti testauksesta puhuttaessa.

Virheenjäljitys on tiedon etsimistä, jossa haetaan vastauksia mitä ohjelma tekee tietyllä hetkellä, miten se on päätynyt tiettyyn tilanteeseen sekä miten kauan kestää suorittaa tietty operaatio tai joukko operaatioita. Debuggauksen aikana voidaan tarvita esimerkiksi laitteiston simulaatiota tai prototyyppejä laitteistosta. Sulautetun järjestelmän debuggaus voi erota merkittävästi pelkän laitteiston tai ohjelmiston debuggauksesta.

Testauksessa havaitut ongelmakohdat raportoidaan virheinä, jolloin virheenjäljityksellä etsitään virheen aiheuttaja (vian syy). Tämän jälkeen voidaan tehdä päätös korjaamisesta, joka voi tapauksesta riippuen olla yksinkertaista tai vaatia suurempia muutoksia. Virheen aiheuttaja voi olla myös konfiguraatiovirhe, jolloin ohjelma ei välttämättä tarvitse lainkaan muutoksia.

Virheiden korjaaminen ja paikallistaminen (ohjelmisto)järjestelmistä on usein hankalaa ja aikaa vievää toimintaa. Monet virhetilanteet esiintyvät vain harvinaisissa erikoistilanteissa, joiden toistaminen tai matkiminen voi olla vaikeaa tai jopa mahdotonta "laboratorio-olosuhteissa". Useissa nykyisin käytettävissä moderneissa ohjelmointikielissä ja ajoympäristöissä ongelmaa on helpotettu mahdollistamalla vianetsintää helpottavien lisätietojen upottaminen varsinaisen ohjelmakoodin sekaan. Lisätiedot voidaan tarvittaessa tulostaa ajonaikaiseen lokiin tai näyttää erityisessä virheenjäljityssovelluksessa, joka mahdollistaa myös ajon hallitun keskeyttämisen, käsky kerrallaan askeltamisen ja erilaisten tilatietojen tarkastelun sekä muuttamisen.

Kaupallisessa ohjelmistotuotannossa virheiden havaitseminen ja korjaaminen pyritään suorittamaan mahdollisimman aikaisessa vaiheessa ennen ohjelmiston julkaisua. Testaus- ja julkaisuprosessi riippuu käytettävästä prosessimallista, mutta yleinen käytäntö on suorittaa *riittävän kattava* testaus ja korjaaminen ohjelmiston kehitysvaiheessa ja julkaista ohjelmistosta *julkaisuehdokas* (yleisesti käytetään termejä *beeta-versio* tai *Release Candidate*), jota suunnitellut loppukäyttäjät voivat testata. Kaikki havaitut virheet raportoidaan ja todetaan mahdollisuuksien mukaan joko ominaisuuksiksi tai virheiksi ja luokitellaan sen mukaisesti. Kun kaikki havaitut virheet on korjattu, ohjelmistosta tehdään varsinainen julkaisu. Jos julkaisun jälkeen havaitaan virheitä, ne korjataan normaaliin tapaan ja jossain vaiheessa ohjelmistosta julkaistaan päivitetty versio.

Menetelmät
----------

Avainkohdat debuggauksessa ovat:

1. toista bugin esiintyminen
2. seuraa ja kerää bugista tietoa
3. tee luettelo mahdollisista syistä ja muodosta hypoteesi
4. kokeile korjausta, poista korjaus ja palauta korjaus

Eräs virhe on kärsimättömyys, joka voi aiheuttaa tieteellisen menetelmän hylkäämiseen: kun on teoria vian syystä teoria on testattava, jotta voi tietää onko se aidosti vian syy ja vasta ongelman syyn ymmärtäessä sen voi ratkaista.

Termi
-----

Vuonna 1947 ryhmä Harvard Mark II -tietokonetta testaavia insinöörejä löysi sen sisältä yöperhosen. Operaattorit kertoivat poistosta, jolloin syntyi termi *debugata*.
Termi *debuggaus* (engl. *debugging*) on johdettu ohjelmointivirheeseen viittaavasta termistä *bug* (suom. ’ötökkä’, täsmällisemmin: ’lude’). Termi on ensimmäisen kerran esiintynyt tietokoneen sisään joutuneen hyönteisen poistossa. Sittemmin termin merkitys on laajentunut kattamaan kaikki ohjelmisto- tai muissa järjestelmissä esiintyvät virheet, joita virheenjäljityksessä todennetaan ja paikallistetaan sekä lopulta korjataan. Toinen astine bug-termille on *defect* (’virhe’ tai ’puute’), jota käytetään kattamaan myös muita ongelmia kuten puuttuvaa dokumentaatiota.

Virheiden seuranta
------------------

Havaitut virheet ja niiden ratkaisut sekä lisätiedot talletetaan usein bugiseurantaohjelmalla. Bugiseurantaan merkitään vikatapauksen selvityksen aikana tietoja, joiden avulla pyritään varmistamaan, että vika tulee korjatuksi.

Etädebuggaus
------------

Etädebuggaus tarkoittaa menetelmää debugata toisessa ympäristössa suoritettavaa ohjelmaa eri ympäristössä ajettavan työkalun avulla: esimerkiksi älypuhelimessa ajettavaa ohjelmaa voidaan debugata kehityskäyttöön tarkoitetulta tietokoneelta käsin.

Anti-debuggaus
--------------

Anti-debuggaus viittaa joukkoon tekniikoita, joilla pyritään estämään tai vaikeuttamaan ohjelman takaisinmallinnusta tai debuggausta. Tyypillisesti tämä tehdään havaitsemalla pieniä eroja ohjelman muistissa tai muussa ympäristön tilassa.

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

* Coredump

Lähteet
-------

1. ↑  Hardware-Assisted Debugging *embedded.com*.  24.9.1991. Viitattu 14.10.2022. (englanniksi)
2. ↑  Debugging at the hardware/software interface *embeddedcomputing.com*.  1.6.2012. Viitattu 14.10.2022. (englanniksi)
3. 1 2  Debugging Techniques (PDF) *web.engr.oregonstate.edu*. Viitattu 14.10.2022. (englanniksi)
4. ↑  Howard Johnson: Debugging hardware *edn.com*.  16.8.2001. Viitattu 14.10.2022. (englanniksi)
5. ↑  Log Book With Computer Bug *si.edu*. Viitattu 5.10.2022. (englanniksi)
6. ↑  NH 96566-KN The First "Computer Bug" *history.navy.mil*. Viitattu 5.10.2022. (englanniksi)
7. ↑  Bug tracking *ibm.com*. Viitattu 14.10.2022. (englanniksi)
8. ↑  Kayce Basques: Remote debug Android devices *developer.chrome.com*.  22.12.2021. Viitattu 14.10.2022. (englanniksi)
9. ↑  Tyler Shields: Anti-Debugging Series - Part I *veracode.com*. Viitattu 14.10.2022. (englanniksi)

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

* Stitt, Martin: *Debugging : creative techniques and tools for software repair*. New York (NY): Wiley, 1992. ISBN 0-471-55829-X. (englanniksi)
* Tip, Frank: *Generic techniques for source-level debugging and dynamic program slicing*. Report CS-R9453. Amsterdam: CWI, 1998. (englanniksi)