linux下的模塊開發,不可避免要用到kgdb來調試,kgdb的調試環境需要一台開發機,一台目標機,其中代碼運行在目標機上,開發機通過串口來調試目標機上的模塊代碼。用vmware可以方便的使用管道來代替真正的串口,而且只用一台筆記本就可以玩起來,非常簡單粗暴
1. 開發機和目標機通過vmware的命名管道建立串口設備,其中開發機作為管道的client,目標機作為管道的server,如圖所示
開發機串口設置
目標機串口設置
之後就可以安裝虛機了,我選用的是CentOS6的發行版本,自帶RedHat裁剪過的2.6.32的內核,之所以選這個版本的內核,因為2.6.28之後的內核版本已經合並了kgdb(之前的mainstream內核版本是沒有kgdb模塊的,需要自己下載一份patch,麻煩。。)安裝完成後,建議你重新編譯一次kernel,我選的是2.6.32.27的kernel.org版本,在make menuconfig時,記得把kernel hacking裡面該選的都選上,特別是kgdb下面的選項都編進內核(具體的.config可以問我要)
All these options on are the “Kernel Hacking” menu.
In order to support KDB, “KGDB” support must be turned on first (even if you aren’t using kgdb/gdb)
Optional other configuration settings:
開發機虛機安裝完之後,最簡單的就是copy一份成為目標機,OK現在萬事俱備了
有兩種方式開始調試,如果你不想kernel在load完之後就hold住,可以在進入shell之後開始搞事。首先在開發機和目標機都是設置下stty參數,這樣串口才可以通信
開發機:stty ispeed 115200 ospeed 115200 -F /dev/ttyS0
目標機:stty ispeed 115200 ospeed 115200 -F /dev/ttyS0
完了之後可以測試下,目標機上cat /dev/ttyS0,然後開發機上echo "test" > /dev/ttyS0,這時候目標機上應該顯示test出來
在目標機上敲 echo ttyS0 > /sys/module/kgdboc/parameters/kgdboc 如果成功,可以在/var/log/message裡看到 kernel: kgdb: Registered I/O driver kgdboc
好了,現在你可以load你的module了(具體如何調試module下一篇文章講),如果想要開始設置斷點,首先需要 echo g > /proc/sysrq-trigger,這時會顯示:
SysRq: DEBUG
Entering KGDB
表示目標機已經開始等待開發機的kgdb連接了
在開發機上,首先用gdb裝載內核,這裡要裝載帶有debug symbol的內核,就是為什麼要編譯一份內核的原因了,我這裡是
gdb /usr/src/kernels/linux-2.6.32.27/vmlinux
(gdb) set remotebaud 115200
(gdb) target remote /dev/ttyS0
如果能看到這個,說明基本成功了,恭喜你!
現在目標機的內核已經break在 wmb()上了,如果你要目標機繼續工作,可以c 一下,做一些事情,然後在目標機上再次敲 echo g > /proc/sysrq-trigger,又會回來
如果想讓kernel在啟動時就hold住等待調試的話,可以修改grub參數,如下圖所示
這樣目標機內核啟動時會打出一條:
kgdb: Waiting for connection from remote gdb
這時用開發機的gdb去連就OK了,按個c,內核正常啟動,搞定