Unixeissa on nerokas virheenetsintätapa: kun ohjelma tekee jotain, mitä se ei saisi tehdä, sen tilasta talletetaan kovalevylle image, "core". (Tämä tapahtuma on ohjelman traagisessa kaatumisessa uskomaton lakonisuuden huippu: virheilmoitus on "segmentation fault (core dumped)".) Näitä imageja voi jälkeenpäin tutkia tarkoitusta varten tehdyllä ohjelmalla, debuggerilla (kaikissa vapaissa ympäristöissä "gdb").
Ohjelmien lopettamisesta ja corejen talletuksesta huolehtii käyttöjärjestelmän ydin. Mutta mitä tapahtuu, kun ydin (kernel) itse huomaa tehneensä jotain, mitä ei olisi saanut tehdä tai, että jonkin ohjelmointivirheen seurauksena sen tila on mennyt sekaisin?
Tässä on suuri ero Linuxissa ja BSD:issa. Rivikäyttäjä ei ehkä osaa arvostaa sitä, mutta se on hyvin tärkeää, kun pitää oikeasti saada tietää, mikä on mennyt vikaan. Linux nimittäin tulostaa tässä tilanteessa ruudullisen tietoa, jonka hyödyllisyys on kyseenalainen, ja jumittuu. BSD taas tallettaa tilastaan "kernel core"n kovalevylle, josta se talletetaan seuraavassa käynnistyksessä, ja käynnistää koneen uudestaan. Tällä tavoin BSD:ita pystyy debuggaamaan kaatumisen jälkeen jopa, vaikka kone olisi jossain kaukana tavoittamattomissa.
Muuten niille, jotka ovat tarpeeksi guruja halutakseen tietää, miten kernelin corea tarkastellaan (tämä on aika hajanaisesti dokumentoitu:)
# Tee debugsymillinen kerneli ja asenna stripattu versio (strip -g) varsinaiseksi kerneliksi. Pane debugsymillinen valmiiksi kansioon /var/crash. # Varmista, että kerneli tietää, mihin coret talletetaan. Tähän on vähintäänkin jokin asetus rc.conf:ssa. NetBSD tekee valmiiksi sen "oikein". sysctl -a | grep core (FreeBSD:ssa muistaakseni dumpon) # (Katso muuten myös, ettei kerneli mene ddb:in panicissa. Siitä ei ole mitään hyötyä, koska gdb:llä saa aikaan kaiken saman ja enemmän. OpenBSD:ssa tämä on oletuksena väärin, sysctl -a | grep ddb) # Varmista myös, että savecore tietää, mistä coret luetaan. rc.conf:n asetus vaikuttaa todennäköisesti myös tähän. # Odotellaan kernel panicia # (Jos olet kuitenkin joutunut ddb:in, anna komento boot dump tjsp.) # Kaatumisen jälkeen: {{{ $ cd /var/crash $ gdb netbsd.gdb (gdb) target kcore=netbsd.0 }}}
[kategoria: työkalut]