Chapter 10. Çekirdek Hatalarını Ayıklama

Table of Contents
10.1. Çekirdek Çökmesinin Dökümünü alma
10.2. Çekirdek Dökümleri ile kgdb Kullanarak hata ayıklama
10.3. DDD Kullanarak Hata Ayıklama
10.4. Dökümün Modern Analizi
10.5. DDB Satır Satır Ayıklama
10.6. Uzak GDB İle Hata Ayıklama
10.7. GDB ile Modüllerin HatalarınıAyıklamak
10.8. Konsol Sürücüsünün HatalarınıAyıklamak
10.9. Kilitlenmeleri Gidermek
10.10. Hata Ayıklama Seçenekleri
Contributed by Paul Richards, Jörg Wunsch, and Robert Watson.

Paul Richards, Jörg Wunsch, and Robert Watson tarafından yazılmıştır.

10.1. Çekirdek Çökmesinin Dökümünü alma

Geliştirme çekirdeğine çalışırken uç durumlarda , aşırı yüklemelerde , onbinlerce bağlantıda , limiti aşan kullanıcısayısında ,yüzlerce jail(8) kullanımında yada FreeBSD-STABLE üzerinde aygıt sürücülerinin yeni özelliklerini kullanırken çekirdek göçebilir. Bu durumda "Kernel Panic " uyarısıalırsınız. Bu bölümde bu duruma sebep olan hatalara nasıl ulaşabileceğimizi anlatacağız.

Çekirdeğin çökmesi durumunda sistem kaçınılmaz olarak yeniden başlatılacaktır. Sistemin yeniden başlatılmasısonucu hafızada ve takas (swap) bölümünde bulunan veriler silinecektir.Hafızada bulunan bu bilgileri korumak için çekirdek takas (swap ) bölümünü geçici depolama alanıolarak kullanır.Göçmenin ardından anabellekte bulunan veriler buraya kaydedilir.Sistem yeniden başlatıldıktan sonra çekirdeğin burada bulunan görüntüsü incelenerek hatalarıayıklanabilir.

Not: Geçici depo bölümü olarak kullanılan takas (swap) aygıtıburada hala swap sistemi ile devam edecektir. Bu yüzden non-swap aygıtlar mesela CDRW gibi aygıtlar desteklenmez. Swap aygıtıdemek harddisk'te swap için ayrılmışbölüm demektir.

Çekirdeğin çökmesine ilişkin çeşitli tiplerde dökümler mevcuttur. Tam hafıza dökümü anabelleğin bütün verilerini tutarken , mini dökümler sadece çekirdeğe ait sayfaların kaydedilmesini sağlar.Bunun yanında yazı halinde gelen dökümler interaktif yada betik ile tanımlanmışhata ayıklama programınıkullanarak elde edilen çıktılarıtutar.FreeBSD 7.0 için mini dökümler varsayılan düzendir. Birçok durumda tam hafıza dökümünde görebileceğimiz bütün bilgileri bize verecektir.Çünkü bir çok problem çekirdeğin durumlarınıgözlemleyerek giderilebilir.

10.1.1. Döküm Aygıtının Ayarlanması

Çekirdeğin içeriğini döküm aygıtına yazdırmadan önce bu aygıtın yapılandırılmasıgereklidir.Çekirdeğe dökümün nereye yapılacağını bildirmek için komutu ile aygıt belirtilir.Eğer döküm takas (swap) bölümüne gerçekleştirilecek ise bu komuttan önce komutu ile swap bölümü ayarlanmalıdır. Genellikle dosyasıiçinde bulunan dumpdev değişkenin swap bölümünün yoluna ayarlanmasıile yada AUTO değeri kullanarak bu mesele halledilebilir.Bu tavsiye edilen yöntemdir.FreeBSD 6.0 için varsayılan değer AUTOdur.

Alternatif olarak döküm aygıtıçekirdek konfigrasyon dosyasında

config(5)
satırınıkodlayarak belirtilebilir.Bu yöntem artık eskimişolup sadece çekirdek
dumpon(8)
        
kullanılmadan önce göçmüşise kullanılabilir.

İpucu: /etc/fstab dizininde yada komutu ile swap aygıtlarını görüntüleyebilirsiniz.

Önemli: Çekirdek göçmeden önce

rc.conf(8) 
dosyasında dumpdir değişkeninin ayarlanmış olmasına dikkat edin.

# mkdir /var/crash
# chmod 700 /var/crash

10.1.2. Çekirdek Dökümünün açılması

Çekirdeğin dökümü yapıldıktan sonra swap aygıtıbağlamadan bu dökümün açılmasıgerekir. Döküm aygıtından döküme erişebilmek için

 savecore
(8) programınıkullanırız.Eğer
        dumpdev
değişkeni rc.conf(5) dosyasında ayarlanmışise bu komut çoklu kullanıcısistemi ile başlatıldığında otomatik olarak çalışacaktır.Dosyanın yerleştirileceği adres yine bu dosyada bulunan
 dumpdir
değişkeni ile belirtilen yer olacaktır. Bu değer varsayılan olarak /var/crash dizinidir ve dökümler vmcore.0 olarak adlandırılır.

Daha önceden bir vmcore.0 dosyasıoluşturulmuşise çekirdek noktanın ardından gelen sayıyı1 arttırarak yeni dökümlerin bu dosyanın üzerine yazılmasınıönleyecektir (vmcore.1 gibi). Hata ayıklarken büyük ihtimalle siz en son yapılan dökümü inceleyeceğinizden sayıdeğeri en yüksek olan dökümü açmalısınız.

İpucu: Eğer yeni çekirdeği test ediyorsanız fakat sistemi çalışır tutmak için farklıbir çekirdeği başlatıyorsanız boot satırında -s kullanarak tek kullanıcılımodda başlatın ve aşağıdaki adımlarıuygulayın.

# fsck -p
# mount -a -t ufs       # make sure /var/crash is writable
# savecore /var/crash /dev/ad0s1b
# exit                  # exit to multi-user

Bu komutlar çekirdek dökümünü /dev/ad0s1b bölümünden alır ve /var/crash dizini altına kaydeder. Bunu gerçekleştirmek için /var/crash dizininde yeterli yeriniz olduğundan emin olmalısınız. Bizim kullandığımız swap bölümü /dev/ad0s1b olarak tanımlıise de siz kendi sisteminizde gerekli bölümü yazmalısınız.