文檔選項
將此頁作為電子郵件發送
本文將首先介紹 Linux 內核上的一些內核代碼監視和錯誤跟蹤技術,這些調試和跟蹤方法因所要求的使用環境和使用方法而各有不同,然后重點介紹三種 Linux 內核的源代碼級的調試方法。調試是軟件開發過程中一個必不可少的環節,在 Linux 內核開發的過程中也不可避免地會面對如何調試內核的問題。但是,Linux 系統的開發者出于保證內核代碼正確性的考慮,不愿意在 Linux 內核源代碼樹中加入一個調試器。他們認為內核中的調試器會誤導開發者,從而引入不良的修正[1]。所以對 Linux 內核進行調試一直是個令內核程序員感到棘手的問題,調試工作的艱苦性是內核級的開發區別于用戶級開發的一個顯著特點。 盡管缺乏一種內置的調試內核的有效方法,但是 Linux 系統在內核發展的過程中也逐漸形成了一些監視內核代碼和錯誤跟蹤的技術。同時,許多的補丁程序應運而生,它們為標準內核附加了內核調試的支持。盡管這些補丁有些并不被 Linux 官方組織認可,但他們確實功能完善,十分強大。調試內核問題時,利用這些工具與方法跟蹤內核執行情況,并查看其內存和數據結構將是非常有用的。 本文將首先介紹 Linux 內核上的一些內核代碼監視和錯誤跟蹤技術,這些調試和跟蹤方法因所要求的使用環境和使用方法而各有不同,然后重點介紹三種 Linux 內核的源代碼級的調試方法。 1. Linux 系統內核級軟件的調試技術 PRintk() 是調試內核代碼時最常用的一種技術。在內核代碼中的特定位置加入printk() 調試調用,可以直接把所關心的信息打打印到屏幕上,從而可以觀察程序的執行路徑和所關心的變量、指針等信息。 Linux 內核調試器(Linux kernel debugger,kdb)是 Linux 內核的補丁,它提供了一種在系統能運行時對內核內存和數據結構進行檢查的辦法。Oops、KDB在文章把握 Linux 調試技術有具體介紹,大家可以參考。 Kprobes 提供了一個強行進入任何內核例程,并從中斷處理器無干擾地收集信息的接口。使用 Kprobes 可以輕松地收集處理器寄存器和全局數據結構等調試信息,而無需對Linux內核頻繁編譯和啟動,具體使用方法,請參考使用 Kprobes 調試內核。 以上介紹了進行Linux內核調試和跟蹤時的常用技術和方法。當然,內核調試與跟蹤的方法還不止以上提到的這些。這些調試技術的一個共同的特點在于,他們都不能提供源代碼級的有效的內核調試手段,有些只能稱之為錯誤跟蹤技術,因此這些方法都只能提供有限的調試能力。下面將介紹三種實用的源代碼級的內核調試方法。



stty ispeed 115200 ospeed 115200 -F /dev/ttyS0 stty ispeed 115200 ospeed 115200 -F /dev/ttyS0 echo hello > /dev/ttyS0 cat /dev/ttyS0 [root@lisl tmp]# tar -jxvf linux-2.6.7.tar.bz2[root@lisl tmp]#tar -jxvf linux-2.6.7-kgdb-2.2.tar.tar[root@lisl tmp]#cd inux-2.6.7 [root@lisl tmp]#patch -p1 <../linux-2.6.7-kgdb-2.2/core-lite.patch [root@lisl tmp]#make menUConfig [*] KGDB: kernel debugging with remote gdb Method for KGDB communication (KGDB: On generic serial port (8250)) ---> [*] KGDB: Thread analysis [*] KGDB: Console messages through gdb[root@lisl tmp]#make [root@lisl tmp]#scp arch/i386/boot/bzImage root@192.168.6.13:/boot/vmlinuz-2.6.7-kgdb[root@lisl tmp]#scp System.map root@192.168.6.13:/boot/System.map-2.6.7-kgdb [root@lisl tmp]#mkinitrd /boot/initrd-2.6.7-kgdb 2.6.7[root@lisl tmp]#scp initrd-2.6.7-kgdb root@192.168.6.13:/boot/ initrd-2.6.7-kgdb 
title 2.6.7 kgdbroot (hd0,0)kernel /boot/vmlinuz-2.6.7-kgdb ro root=/dev/hda1 kgdbwait kgdb8250=1,115200 image=/boot/vmlinuz-2.6.7-kgdblabel=kgdb read-only root=/dev/hda3append="gdb gdBTtyS=1 gdbbaud=115200" gdbfile vmlinuxset remotebaud 115200target remote /dev/ttyS0 [root@lisl boot]#gdbstart -s 115200 -t /dev/ttyS0 [*]KGDB: kernel debugging with remote gdbMethod for KGDB communication (KGDB: On ethernet) ---> ( ) KGDB: On generic serial port (8250)(X) KGDB: On ethernet title 2.6.7 kgdbroot (hd0,0)kernel /boot/vmlinuz-2.6.7-kgdb ro root=/dev/hda1 kgdbwait kgdboe=@192.168.5.13/,@192.168. 6.13/ [root@lisl tmp]# insmod -m hello.ko >modaddr .this 00000060 c88d8000 2**2.text 00000035 c88d8060 2**2.rodata 00000069 c88d80a0 2**5…….data 00000000 c88d833c 2**2.bss 00000000 c88d833c 2**2…… (gdb) Add-symbol-file hello.o 0xc88d8060 -s .data 0xc88d80a0 -s .rodata 0xc88d80a0 -s .bss 0x c88d833c …… …… if (mod->init != NULL) ret = mod->init();…… …… ……int bss_var;static int hello_init(void){printk(KERN_ALERT "Text location .text(Code Segment):%p/n",hello_init);static int data_var=0;printk(KERN_ALERT "Data Location .data(Data Segment):%p/n",&data_var);printk(KERN_ALERT "BSS Location: .bss(BSS Segment):%p/n",&bss_var);……}Module_init(hello_init); 


[root@lisl tmp]#chmod +x arm-uclinux-tools-base-gcc3.4.0-20040713.sh[root@lisl tmp]#./arm-uclinux-tools-base-gcc3.4.0-20040713.sh [root@lisl tmp]# tar -jxvf uClinux-dist-20041215.tar.bz2[root@lisl uClinux-dist]# tar -jxvf linux-2.6.9.tar.bz2[root@lisl uClinux-dist]# gzip -dc linux-2.6.9-hsc0.patch.gz patch -p0 [root@lisl uClinux-dist]# gunzip linux-2.6.9-hsc0.patch.gz [root@lisl uClinux-dist]patch -p0 < linux-2.6.9-hsc0.patch [root@lisl uClinux-dist]# rm -rf linux-2.6.x/[root@lisl uClinux-dist]# mv linux-2.6.9 linux-2.6.x [root@lisl uClinux-dist]# cd linux-2.6.x[root@lisl linux-2.6.x]#make ARCH=armnommu CROSS_COMPILE=arm-uclinux- atmel_deconfig [root@lisl linux-2.6.x]#make ARCH=armnommu CROSS_COMPILE=arm-uclinux-oldconfig [root@lisl linux-2.6.x]# make ARCH=armnommu CROSS_COMPILE=arm-uclinux- v=1 CFLAGS += -g EXPort PATH=$PATH:/root/bin/arm-linux-tool/bin







李樹雷,清華大學計算機系碩士研究生,主要從事操作系統與中間件的研究。通過lisl03@mails.tsinghua.edu.cn 可以跟他聯系
陳渝, 清華大學,通過 yuchen@tsinghua.edu.cn 可以和他聯系。 新聞熱點
疑難解答