10.5. DDB Satır Satır Ayıklama

kgdb programıne kadar kullanışlıbir arayüz sağlasa da yapamayacağıbazıişler vardır. Bunlardan en önemlileri kesme (break point) bırakma ve adım adım işletme özellikleridir.

Çekirdeğiniz üzerinde daha düşük seviyeli bir hata ayıklamaya ihtiyacınız varsa DDB adlıprogram işinizi görecektir. Bu program breakpoint bırakmaya, adım adım işlemeye , çekirdek değişkenlerini değiştirmeye izin verir . Ama çekirdeğin kaynak kodlarına ulaşmaz ve gdb nin sağladığıhata ayıklama bilgilerinin hepsini sağlamaz.Ayrıca sadece static yada global değişkenlerin verilerini değiştirme imkanına sahiptir.

Çekirdeğinizi DDB içerecek şekilde ayarlamak için ayar dosyasına aşağıdakileri eklemelisiniz ve çekirdeği yeniden derlemelisiniz:

options KDB options DDB

(http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/index.html) adresinden çekirdeğin ayarlanmasınıdaha detaylı öğrenebilirsiniz.

Not: Eğer daha eski boot bloklarına sahipseniz hata ayıklama sembolleri tam olarak yüklenmemiş olabilir. Boot bloklarınıgüncellerseniz DDB sembolleri otomatik olarak yüklenecektir.

DDB çekirdeğini çalıştırdıktan sonra buna girmek için çeşitli yöntemler mevcuttur.Birincisi ve eski olanıboot satırında -d seçeneği ile başlatmaktır. Bundan sonra çekirdek hata ayıklama modunda hiç bir aygıt yüklemeden DDB ye girişyapacaktır. İsterseniz probe ve attach fonksiyonlarının da hatalarınıayıklabilirsiniz. FreeBSD-CURRENT kullanıcılarıboot ayarlarına geçmek için menüden 6. seçeneği seçebilirler.

İkinci senaryo ise sistem yüklendikten sonra hata ayıklama programına geçmektir. Bunu gerçekleştirmek için iki basit yöntem vardır. Komut satırından ulaşmak için bu komutu verin:

# sysctl debug.kdb.enter=1

Not : " Kernel panic " anında DDB ye geçmeye zorlamak için şunları yazabilirsiniz:

# sysctl debug.kdb.panic=1

Alternatif olarak eğer sistem konsolundaysanız klavyeden kısayol tuşlarınıkullanabilirsiniz. Standart olarak hata ayıklama programıiçin durdurma CTRL+ ALT + ESC tuşlarıile gerçekleştirilir.Bazısistemlerde sıralamasınıdoğru yapmadığınız takdirde kabul etmeyebilir o yüzden sıralamaya da dikkat ediniz. Seri konsollarda Konsol satırıüzerinden seri olarak gelen BREAK sinyalleri ile DDB ye girmek için bir seçenek mevcuttur (çekirdek ayar dosyasında options BREAK_TO_DEBUGGER seçeneği) ama standart değildir çünkü normal şartlarda bir kablonun çıkarılmasıbile bu sinyalin oluşmasına neden olabilir.

Üçüncü yöntem ise çekirdek ayarlanmışise "Kernel Panic" durumunda direk olarak DDB ye girecektir. Bu yüzden makine gözetim altında olmadan beklenmeyen bir durumda hata ayıklama moduna geçecek şekilde ayarlamak çok büyük bir problem değildir.

Bu fonksiyonelliği kazanmak için aşağıdaki satırlarıçekirdek ayar dosyasında ekleyiniz :

options KDB_UNATTENDED

Sonra çekirdeği tekrar derlemeniz gerekecektir.

DDB komutlarıaşağıyukarıgdb komutlarına benzemektedir.İlk olarak ihtiyacınız olacak şey belki de break point koymaktır.

break function-name address

Sayılar varsayılan olarak 16lıtabanda gösterilecektir ama a-f ile başlayanlarısembol isminden ayırmak için bunları0x ile başlatılır. Basit bir ifade olarak mesela : fonksiyon ismi + 0x103.

Hata ayıklama programından çıkmak ve çekirdeğin çalışmasına devam etmek için şu komut kullanılır :

continue

Yığın içindeki fonksiyon çağrılarınıyani stack trace' i görmek için gereken komut:

trace

Not: Eğer DDB ye kısayol tuşları ile geçişyapıyorsanız çekirdek bir kesme oluşturacak sonuç olarak 'stack trace' tam manasıile işe yaramayacaktır.

Eğer bir breakpoint'i silmek istiyorsanız bu komutu kullanınız :

del del (adres ifadesi)

İlk olan breakpoint'e geldikten sonra direk olarak kabul edilecek ve geçerli breakpointi silecektir. İkinci ifade ise bütün breakpointleri silebilir ama tam adresinin verilmesi gereklidir.Bu breakpointlerin yerlerini öğrenmek için :

show b show break

komutlarınıkullanabilirsiniz.Hata ayıklama modunda bir adım ilerlemek için :

s

komutu kullanılabilir. Ama bu komut fonksiyonların içine girecektir . Eğer fonksiyonların sonuna kadar ulaşılmak istenirse :

n

komutu kullanılır.

Not: Bu komut gdb'nin

 next
      
komutundan farklıdır ;daha çok
 finish
komutuna benzer.Birden fazla
 n 
komutu göndermek
 continue
      
işlemi gibi algılanacaktır.

Hafızadaki veriler incelenmek istenirse , aşağıdaki örnekler gibi kullanılabilir :

x/wx 0xf0133fe0,40 x/hd db_symtab_space x/bc termbuf,10 x/s stringbuf

word/halfword/byte şeklinde ulaşımlar hexadecimal/decimal/character/ gösterimler / karekterinden sonra belirtilmiştir. Virgülden sonra gelen değer kaç tane objeye erişilmek istendiğidir. Sonraki 0x10 elamanıgöstermek için basitçe :

x ,10

yazabilirsiniz .Benzer şekilde :

x/ia foofunc,10

foofunc fonksiyonundan sonra gelen 0x10 komutu görebilirsiniz.Bunlarıofsetleri ile beraber görmek isterseniz :

w/b termbuf 0xa 0xb 0

w/w 0xf0010030 0 0

/ karakterinden sonraki harfler bit , half byte yada word mu yazılacağınıbelirler. Bundan sonra gelen ilk ifade yazılacak adresi belirtir.Geri kalan ise bu adrese yazılacak veridir.

Eğer yazmaçlara ulaşmak isterseniz :

show reg

Yada alternatif olarak tekbir yazmacıgörüntülemek için :

p $eax

yazmaçların içeriğini değiştirmek için :

set $eax new-value

Eğer bazıçekirdek fonksiyonlarına ihtiyacınız olursa :

call func(arg1, arg2, ...)

yazabilirsiniz . Fonksiyonlar bitirilince dönüşdeğerlerini yazdıracaktır.Şu anda çalışan süreçlere ulaşmak isterseniz :

ps

Diyelim ki problemi çözdünüz ve çekirdeğin neden hata verdiğini anladınız ve artık yeniden başlatmak istiyorsunuz. Fakat unutmayın ki önceki hatanın ciddiyetine bağlıolarak çekirdeğin bütün kısımları çalışmayabilir.Sisteminizi tekrar başlatmak için şunu yazın :

panic

Böylece çekirdek bir döküm oluşturarak yeniden başlatılacaktır.Bu dökümü daha sonralarıgdb ile inceleyebilirsiniz.

call boot(0)

Komutu çalışan bir sistemi temizlemek ,kapatmak,yeniden başlatmak ve disklere sync() komutu göndermek için en iyi yöntemdir. Eğer çekirdeğin dosya sistemi arayüzü bozulmadıise temiz bir kapanışiçin en iyi yoldur.

call cpu_reset()

Tehlike anında basılacak kırmızıdüğme vazifesi görür.

help

Yardım komutudur.

Bir de hata ayıklama işlemine başlamadan önce ddb(4) programının kullanım klavuzunun çıktısınıyanınızda bulundurmanız tavsiye edilir.Çünkü çekirdeği incelerken bilgisayardan döküman okumanız oldukça zor olacaktır.