作者:netchecking
msn :[email protected]
blog:http://blog.csdn.net/netchecking/
當前最憤恨的就是網上太少又關於kdb的文章,有很多誤導,即使有大都很難按照步驟成功運行。筆者通過大量的實踐和對kdb的使用經驗,願意把詳細的步驟寫出來與大家分享。
編譯kdb。
步驟1:
kdb不是Linux內核的標准配置,需要先到這個網站上去下載一個版本,2個文件
ftp://oss.sgi.com/projects/kdb/download/v4.4/
kdb-v4.4-2.6.15-common-1(kdb-v4.4-2.6.15-common-1.bz2)
kdb-v4.4-2.6.15-i386-1(kdb-v4.4-2.6.15-i386-1.bz2)
步驟2:
下載一個純的linux內核源碼文件。
記住,一定要是純的linux內核源碼,不能是什麼redhat等等公司出的版本。否則在pacth時就會出現error了。
比如有一次我把patch打到了/usr/src/redhat/BUILD/kernel-2.6.15/linux-2.6.15.i686裡就發生了錯誤,這個目錄是redhat自己改過的源碼,不是純的源碼,所以出錯。
下載到的源碼必須和步驟1的小版本一致。比如我的純linux內核版本是2.6.15-1***。
把linux純內核源碼文件命名為linux,放到/usr/src中。
步驟3:
把步驟1得到的解壓後的2個文件kdb-v4.4-2.6.15-common-1,kdb-v4.4-2.6.15-i386-1放到/usr/src/linux目錄裡。
這時就會很順利的patch成功,只要不出現什麼reject這樣的提示就算成功。
一旦發現出現了reject這樣的信息,只有2種可能:
一是你的內核不是真正的內核,是公司改進過的內核;二是kdb版本和源碼版本不一致。
步驟4:
該linux配置,在這裡千萬不要用make menuconfig這樣的命令,你可能很奇怪,為什麼?我的經驗表明,不同的linux/kdb版本menuconfig出來的kdb選項有很大的不同,用語言是無法准確描述,我原來參考很多網上的資料都是根據menuconfig來,造成了描述矛盾,很難搞明白。在這裡,我們直接改寫文件最為牢靠。
先運行make menuconfig這個命令,不更改任何選項,直接回車,然後選擇yes,這樣就能生成一個隱藏的文件.config了。
用vi/vim 打開這個文件,
改寫如下:
CONFIG_KDB=y
CONFIG_KDB_MODULES=n
CONFIG_KDB_OFF=n
CONFIG_KALLSYMS=y
CONFIG_FRAME_POINTER=y
保存。記住,這樣做比在menuconfig菜單選項裡選擇要安全和清晰的多。
打開kdb/kdb_cmds這個文件,全部注釋掉所有:例如:
# Initial commands for kdb, alter to suit your needs.
# These commands are executed in kdb_init() context, no SMP, no
# processes. Commands that require process data (including stack or
# registers) are not reliable this early. set and bp commands should
# be safe. Global breakpoint commands affect each cpu as it is booted.
# Standard debugging information for first level support, just type archkdb
# or archkdbcpu or archkdbshort at the kdb prompt.
defcmd archkdb "" "First line arch debugging"
#set BTSYMARG 1
#set BTARGS 5
#-archkdbcommon
#-bta
endefcmd
defcmd archkdbcpu "" "archkdb with only tasks on cpus"
#set BTSYMARG 1
#set BTARGS 5
#-archkdbcommon
#-btc
endefcmd
defcmd archkdbshort "" "archkdb with less detailed backtrace"
#set BTSYMARG 0
#set BTARGS 0
#-archkdbcommon
#-bta
endefcmd
為什呢,因為大家剛開始接觸kdb時,非常不熟悉,如果把全部選項都注釋後,kdb就變的比較容易操作,否則重啟系統以後,你還以為安裝出錯呢,不信可以試試,呵呵。等你水平高了以後,在改過來,重新編譯系統就可以了。
步驟5:
改寫Makefile文件中的EXTRAVERSION,隨便取個名字吧。
make all
make bzImage
make modules
make modules_install
make install
有文章說要改寫什麼lilo文件。
不用改寫什麼lilo文件,你的系統如果只支持grub,你根本在系統裡找不到lilo,改什麼改!!!
步驟6:
重啟,在系統選項裡選擇這個新的系統就可以了。
在系統開始引導時,你會在屏幕上看到3-5行關於kdb的信息,其實就是kdb_cmds裡的配置,我們已經注釋掉了,所以光顯示,不會運行(這樣最安全,否則如果你對kdb不熟,改kdb_cmds錯了,在啟動時就會出現什麼內核panic的恐怖信息,這就是總是不能啟動成功的原因)。
看到其他的啟動跟沒安裝kdb時一樣,成功進入提示你輸入用戶名,密碼進入系統時,就表明你的kdb才真正的安裝成功了。
啟動kdb,用root權限進入系統。
# echo "1" > /proc/sys/kernel/kdb 回車以後沒什麼反映,說明啟動成功了。
我有個同事運行這個命令以後,提示找不到kdb這個文件,後來我給他調試時發現kdb根本就沒安裝成功,最後我給他重新安裝就沒問題了。
按“Pause Break”鍵,就會出現kdb的使用接口了。如果想退出,就輸入go,然後按回車即可。我後來發現通過f1進入系統後,輸入go+回車後
怎麼也退不出來,在f2進入系統後,輸入go+回車後就很順利的退出了,這個現象非常奇怪,我猜可能跟linux本身有關系。
使用kdb。
誰說kdb不能源碼級調試,那時他沒真正用過kdb.
其實kdb是可以源碼級調試的,在這裡的前提是對源碼級調試的定義,反正你使用kdb用單步跟蹤時是可以看到源碼也一行一行的自動走的,對
你懷疑有bug的地方進行查看,非常方便。
關於使用kdb誰說都沒用,關鍵看文檔,記住不要看其他任何第三方的文檔(有很多誤導),就看上面你的Documentation/kdb裡的slides等文檔,這才是最沒有污染和最正宗的文檔。