1. 程式人生 > >ubuntu下linux核心原始碼閱讀工具和除錯方法總結 (2010-10-31 15:21)

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 + qemu 進行linux原始碼的編譯和除錯

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

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的偵錯程式也足夠強大,但是每次除錯前都要進行編譯,時間太久了,等不起!! 哪位大俠可知道如何每次除錯不要編譯!!