轉載自http://www.unixresources.net/linux/clf/linuxK/archive/00/00/70/85/708507.html#article709039
本人水平有限,只是把使用過程記錄下來,希望對有這方面需求的人有點參考.
基本軟硬體環境描述:
基於ARM的demo板(Freescale I.MX系列),帶有一個UART口和網口。
kernel 2.6.26. 已經支援了kgdb。其實24核心版本也是可以的,我已經驗證過了。本人已經根據自己的公司的kernel版本製作了一個patch,但目前估計還不適合大家,等整理完後,看看是不是可以上傳上來。
由於時間問題,我只能分段的逐步記錄。 希望各位筒子們多支援,並給出建議。
(一) 先看看打完patch後的一些配置及基本的使用。 ^_^ 採用倒序的方法可能好些吧,先看看kgdb到底可以做什麼,然後再來考慮如何的修改代碼。kgdb的基本原理,眾所周知了,不知道的google一下吧。26好像只支援uart的調試。 patch完成後,make menuconfig吧, 如果你看到了以下這些並把它們選上這些就可以了:
Kernel hacking -->
Kernel debugging
compile the kernel with debug info
KGDG: kernel debugging with remote gdb -->
KGDB: use kgdb over the serial console
然後就是編譯核心了,編譯完成後,載入啟動,這裡需要修改啟動參數,具體的就看大家用的是什麼bootloader了,不過基本都差不多吧,我用的是redboot, 增加以下幾個參數設定:
"kgdboc=ttymxc0,115200 kgdbwait"
總共就是三個參數吧,kgdboc/kgdbwait/kgdbcon,這裡沒有用kgdbcon,如果用的話,就把這個加進去就可以了,加進去後,輸出到控制台的msg就會在gdb的調試台看到了。
設定完成後,複位板子吧,如果你看到了如下的資訊,kgdb就正常啟動了:
"kgdb: Waiting for connection from remote gdb..."
到此,target上是啟動完成了,接下來就是等待來自host的gdb client 串連請求了。繼續。上一節的內容。
用戶端的串連比較簡單,最好找到目標編譯工具鏈的gdb,比如arm-linux-gdb啥的,到kernel原始碼目錄下運行: xx-gdb vmlinux. 接著設定一下gdb的串連.通過串口來與target通訊。
gdb> target remote /dev/ttyS0
串連成功後,你可以看到一些列印訊息,同時target的console上也會列印一些RSP協議的碼流。ok,到此gdb client和target的 gdb stub完成的連線協定的互動,也就可以接收debug命令了,設個斷點試一試吧。需要注意的是,這是在kernel初始化時被中斷的,具體中斷在什麼位置,這個估計系統不一樣還是有區別的,大家看看啟動資訊就知道了,你設定的斷點肯定是要在這之後初始化的代碼才可以的。
(二)
上一節的調試,只能完成初始化代碼的debug,比如module_init之類的。接下來再說一下系統正常啟動後,如何再進入偵錯模式,並且如何調試手動載入的module。
kgdb提供了magic_sysrq, 索引值是'g'。所以系統啟動後,你可以通過如下的命令再次進入到偵錯模式: echo g > /proc/sysrq_trigger 這樣你又可以通過host的gdb 設定斷點啥的。斷點已經在kernel中儲存下來了,然後再回到控制台執行命令,運行到斷點處,系統中斷。然後又可以從gdb上調試代碼了。這段時間太忙了。來不及整理這些東西。年後再把module調試那部分加上來吧。 樓上的兄弟,我個人估計你在2.6.12上也是可以用起來的。你從2.6.26核心中把KGDB相關的代碼移到你的核心中,應該問題不大的,只要把那兩個UART的讀寫實現一下,基本就可以了。如果你的板子有兩個串口相信用起來更方便。 |
|
|