ubuntu下linux內核源碼閱讀工具和調試方法總結 (2010-10-31 15:21)



一 linux內核源碼閱讀工具

windows下當然首選source insight, 但是linux下就沒有source insight這麼優秀的工具了,但是也有不少的替代品,但覺絕對部分人會選擇vim+ctags+cscope的組合,還有部分人或選擇wine中的source insight或選擇navigatror,當然對於代碼閱讀來說vim+ctags+cscope的組合還是比較好的一個選擇方案,但是,當我使用了eclipse之後,個人感覺用eclipse作爲linux環境下源碼閱讀工具確實比vim+ctags+cscope的組合方便很多。

下面是linux環境下eclipse的配置安裝方案:

eclipse下載地址:http://eclipse.org/downloads/?osType=linux

eclipse環境配置方案:http://forum.ubuntu.org.cn/viewtopic.php?t=183803

二 eclipse + qemu 進行linux源碼的編譯和調試

最初調試內核採用了qemu + insight 或qemu + ddd的組合,相比來說insgiht的界面更加有好些,但是ubuntu 10.04以上的版本,刪除了對Insight的默認支持,只能下載insight的源碼編譯安裝,而且insight更新非常慢。 很久以前就看到有人用eclipse + qemu進行linux內核源碼的編譯和調試,這次終於抽了個時間嘗試一下,畢竟eclipse的debugger是非常強大的。

工具組合: Eclipse IDE for C/C++ Linux Developers + qemu-0.12.3 (最好用kvm, 不幸的是機器太舊,不支持硬件虛擬化)

1.首先我們要從www.kernel.org下載內核源碼,在這裏我選擇的是 linux-2.6.32.tar.bz2。我將其下載到我的主目錄下,然後在terminal下輸入以下命令。

$ cd (回到主目錄)

$ tar xf linux-2.6.32.tar.bz2 (解壓源碼)

$ mkdir linux-2.6.32-obj (創建一個編譯內核的目標文件輸出目錄)

$ cd linux-2.6.32 (進入內核源碼樹根目錄)

$ make O=~/linux-2.6.28-obj menuconfig (這裏我們要配置內核,並在~/linux-2.6.32-obj目錄下生成內核配置文件.config)

$ make mrproper

2. 接下來我們打開elicpse,第一次打開時有一個歡迎畫面,

我們單擊右邊的workbench圖片關掉歡迎畫面。由於eclipse cdt是一個非常強大的c/c++ ide,它默認會自動的解析工程中源程序並編譯工程和產生智能提示信息。但由於我們調試內核過程中暫不會用到這些功能,所以要關閉他們。

首先我們到Window->Preferences->General->Workspace 中將Build Automatically選項去掉。

然後到Window->Preferences->C/C++ -> Indexer中,將默認的Fast c/c++ indexer改爲No indexer。

然後我們開始創建一個新的工程。

從菜單中選擇File -> New -> Project... -> C/C++ -> C Project 然後單擊Next按鈕。

這時出現一個對話框,在Project Name 一欄填入一個工程名,比如 linux-kernel. 然後將 Use default location 選項給勾掉。在Location一欄填入剛纔解壓的內核源碼的路徑。Project type選擇Makefile project -> Empty project。Toolchains 選擇 Linux GCC.最終結果如下圖所示:

然後單擊Next按鈕,出現下一個對話框。這時候因爲工程的默認配置還不完全符合我們的要求。所以我們單擊 Advanced Settings 按鈕會打開一個工程配置對話框。我們選擇左側的 C/C++ Build 選項,在相應的右側頁面裏我們將Builder Settings 選項頁下的 Use default build command 勾選掉,然後指定一個新的Build command 爲 make O=/home/xxx/linux-2.6.28-obj.然後單擊Build location中的File system...按鈕更改obj文件的輸出目錄爲/home/xxx/linux-2.6.28-obj. 最終結果如下圖所示:

然後單擊Behaviour選項頁,將build(Incremental Build)中的all更改爲一個空格,將下面的clean更改爲mrproper(這是默認清除內核obj文件的命令目標)。弄好後如下圖所示:

這個時候你就可以編譯內核了。Ctrl + B 開始編譯內核。

編譯完內核。在/home/xxx/linux-2.6.32-obj/arch/x86/boot/下將生成一個bzImage的大內核鏡像。

此時我們在xterm下運行qemu虛擬機,命令行如下:

$ qemu -s -S -hda ~/linux-0.2.img -kernel /home/xxx/linux-2.6.32-obj/arch/x86/boot/bzImage -append root=/dev/hda

我解釋一下這個命令行上的參數。

-s 選項表示我們運行虛擬機時將1234端口開啓成調試端口,供eclipse網絡調試時使用

-S 選項表示我們啓動虛擬機時要“凍住”虛擬機,等待調試器發出繼續運行的命令。

-hda ~/linux-0.2.img 表示我們要運行時的硬盤 (這個文件可以在http://wiki.qemu.org/Download下到)
-kernel /home/xxx/linux-2.6.32-obj/arch/x86/boot/bzImage 表示我們要調試的內核鏡像

-append root=/dev/hda 表示我們要傳遞給內核的參數(這裏你可能感覺有點奇怪爲啥是/dev/hda而不是/dev/hda1或是/dev/hda2呢?因爲這個鏡像僅僅是一個分區的二進制鏡像,不是整個硬盤的鏡像)

啓動後,你會看到屏幕黑黑的啥也沒有。因爲我們指定了-S參數把虛擬機給“凍”住了。

繼續回到eclipse中,這時候我們在菜單中選擇Run -> Debug Configurations ,這時候打開一個配置頁面。然後我們在C/C++ Application上雙擊鼠標,這時在右側的頁面彈出了debug配置選項,然後我們在project一欄選擇 linux-kernel ,在下面的C/C++ Application中填入/home/xxx/linux-2.6.32-obj/vmlinux,如下圖所示:

然後我們單擊Debugger選項頁,將Debugger改爲 GdbServer Debugger . 將Stop on startup at 改爲start_kernel,將Connection子選項頁下的Type改爲TCP將Port number改爲1234,最終如下圖所示:

然後單擊Debug按鈕開始調試!這時候Eclipse會提示我們切換 Perspective ,選擇是,不再提示。

這時候就開始調試內核,而且是源碼級的調試!如下圖:

總結:不知道是我機器爛還是咋地,eclipse+qemu雖然調試信息更加詳細,eclipse的調試器也足夠強大,但是每次調試前都要進行編譯,時間太久了,等不起!! 哪位大俠可知道如何每次調試不要編譯!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章