1. 程式人生 > >gdb除錯Linux核心

gdb除錯Linux核心

原理
gdb可以支援遠端的除錯,串列埠連線和tpc/ip網路連結兩種。
在Ubuntu 9.10Linux下面,virtualbox 作為虛擬機器,裝有待除錯的Linux系統。
a.建立連結。
這裡選擇串列埠方式除錯。在virtualbox的虛擬機器配置中,把串列埠設定為"COM1","Host-pipe"模式,並勾選"建立",輸入:"/tmp/v_pip0"作為和虛擬機器串列埠連結的管道。至此,虛擬機器和除錯平臺的連結完成。
b.測試串列埠工作:
在Gest OS裡面輸入stty ispeed 115200 ospeed 115200 -F /dev/ttyS0來設定串列埠COM1的工作速度。
在Host OS裡面下載Minicom串列埠工具,設定它的配置檔案(/etc/minicom/minirc.df1)寫入如下:
pu port unix#/tmp/v_pip0
啟動minicom,連結上以後,顯示線上。在Gest OS一邊可以通過cat、echo命令來讀寫串列埠,minicom這邊可以直接輸入,串列埠到達的資料將會直接顯示在螢幕上面。
如果可以通訊,說明串列埠正常工作了。
c.編譯可以被除錯的核心:


選擇通過串列埠除錯核心
-------------------------------------------------------------------------------------------
make menuconfig  -> kernel hacking ->
[*] Kernel debugging  [*]
[*] Compile the kernel with debug info
[*]KGDB: kernel debugging with remote gdb  ---> 
--- KGDB: kernel debugging with remote gdb 
<*>   KGDB: use kgdb over the serial console  

-------------------------------------------------------------------------------------------

d.設定除錯環境:
>寫入/boot/grub/grub.cfg 啟動專案:
linux /boot/... 條目後:kgdboc=1,115200
>將新核心拷貝到Host OS作除錯用。記住:要拷貝vmlinux而非vmlinuz(是經過壓縮的)。
e.啟動gdb開始除錯:
>啟動新核心後,除錯的時候,在Gest OS裡面輸入stty ispeed 115200 ospeed 115200 -F /dev/ttyS0來設
置串列埠COM1的工作速度,按下ALT+Print SysRq+g
魔法鍵,開啟gdb除錯,系統凍結,並顯示KGDB
waiting

>在Host OS上面執行:
socat udp4-listen:6443 /tmp/v_pip0
將管道對映到udp埠
執行gdb ./vmlinux
進入後,設定gdb目標:
target remote udp:localhost:6443
等待一會兒,就和Gest OS連結上了
-----------------------------------------------------------------------------------------------------------------------------------
ps:模組除錯
>
啟動模組除錯前,先將模組插入系統,並確保模組編譯時候CFLAGS有-g選項。把模組檔案,模組原始檔拷
貝到Host OS中,執行:cat /proc/modules 查詢模組的載入地址,記下來,在Host OS中gdb除錯的時候
會用到。
>
gdb 執行後,通過 add-symbol-file 命令載入模組的符號:
(gdb) add-symbol-file my-module.ko address
此處address就是模組的載入地址,在已經上面得到。
至此,模組已經可以除錯(設定斷點等)。

*******************************************************

for kernel, i suggest u to use kgdb


http://kgdb.sourceforge.net/connect.html

http://www.cs.wm.edu/~bob/ddd-with-modules.html

**********************************************************