10.7. GDB ile Modüllerin HatalarınıAyıklamak

Bir modülde çökmenin hatalarınıayıklarken yada uzak GDB ile dinamik modüllerin kullanımında GDB ye bu modüle ait sembollerin nasıl elde edileceğini bildirmeniz gereklidir.

İlk olarak modülleri de hata ayıklama bilgisi ile derlemelisiniz :

# cd /sys/modules/linux # make clean;make COPTS=-g

Eğer uzak GDB kullanıyorsanız hedef makine üzerinde kldstat ' ı başlatın böylece modüllerin nereye yüklendiğini bulabilirsiniz.

# kldstat Id Refs Address Size Name 1 4 0xc0100000 1c1678 kernel 2 1 0xc0a9e000 6000 linprocfs.ko 3 1 0xc0ad7000 2000 warp_saver.ko 4 1 0xc0adc000 11000 linux.ko

Eğer döküm dosyasıile hata ayıklamasıyapıyorsanız aradığınız dosya ismini bulmak için linker_files listesinde

linker_files->tqh_first
işaretçisinden başlayarak
link.tqe_next
işaretçisi ile arama yapmalısınız.Kaydın address üyesi modülün yüklenmişolduğu adresi verecektir.

Sonra modülün text bölümünün ofsetini bulmalısınız.

# objdump --sect1-headers /sys/modules/linux/linux.ko |
      grep text 3 .rel.text 000016e0 000038e0 000038e0 000038e0
      2**2 10 .text 00007f34 000062d0 000062d0 000062d0
      2**2

Yukarıdaki örnekte aramışolduğumuz .text bölümünün yukarıda 10. bölümdür. Dördüncü 16lıalanda bölümün ofseti bulunur. Bunu modülün yüklenme adresine eklersek modülün kod bölümünün adresine erişiriz.Bizim örneğimizde 0xc0adc000 + 0x62d0 = 0xc0ae22d0 elde ederiz.

add-symbol-file
komutu ile GDB yi modül hakkında bilgilendirmişoluruz.

(kgdb) add-symbol-file /sys/modules/linux/linux.ko
      0xc0ae22d0 add symbol table from file "/sys/modules/linux/linux.ko" at
      text_addr = 0xc0ae22d0? (y or n) y Reading symbols from
      /sys/modules/linux/linux.ko...done. (kgdb)

Artık modülün içindeki hata ayıklama sembollerine erişebilirsiniz.