Eclipse CDT + QEMU 調試linux內核

有關調試的好處我想大家都不言自明瞭。本文章摘自原文,但加入了原文中沒有說明的一些細節內容。

我的系統環境是:Ubuntu 9.10 + eclipse-cpp-galileo-SR1-linux-gtk.tar.gz + QEMU 0.11.0Ubuntu 在安裝時,如同大部分 Linux 發行版一樣,都會同時安裝 GNU 版本的 Java。這個 Java 
的實用程度太低,尤其對於開發人員來說,是沒有太多用處的。在 Ubuntu 下,安裝 SUN Java 是一件很容易的事情。

第一步: 

sudo apt-get install sun-java6-jre
sudo apt-get install sun-java6-jdk

安裝完畢之後,選擇默認 java:
sudo update-alternatives --config java

然後配置環境變量:
sudo vim /etc/environment

在其中添加如下兩行:
CLASSPATH=/usr/lib/jvm/java-6-sun/lib
JAVA_HOME=/usr/lib/jvm/java-6-sun

保存退出。 
之後安裝配置 Eclipse。安裝很簡單:
sudo apt-get install eclipse

雖然已經這時新安裝的 java 
已經成爲系統默認的 jvm,但是 Eclipse 並不會用 update-alternative 設置的jvm 來啓動自身,而使用的是以前的 GNU 
Java。GNU Java 是 1.4.2 的實現,而且在性能上遠不如 SUN 的實現。爲了讓Eclipse 利用 SUN Java 
啓動,我們還需要繼續配置。首先把 SUN Java 完完全全的設置爲系統的默認 JDK: 

sudo update-java-alternatives -s java-6-sun

然後編輯 JVM 配置文件:
sudo vim /etc/jvm

把文件中的
/usr/lib/jvm/java-6-sun

這一行移動到配置塊的頂部。由於 Eclipse 
會忽略 Ubuntu 的通用 Java 設置(貌似一個 bug),我們需要繼續編輯 Eclipse 的 java_home 文件:

sudo vim /etc/eclipse/java_home

如同上面一樣,把
/usr/lib/jvm/java-6-sun 


這一行移動到文件的頂部。所有的安裝配置完成之後,Ubuntu 的 Java 
開發平臺就基本完備了。

安裝CDT:

http://www.eclipse.org/cdt/downloads.php
下載CDT


http://www.eclipse.org/downloads/download.php?file=/tools/cdt/releases/callisto/dist/3.1.2/org.eclipse.cdt-3.1.2-linux.x86.tar.gz

tar zxvf org.eclipse.cdt-3.1.2-linux.x86.tar.gz 


解壓後將features和plugins文件夾下的所有文件拷貝到/usr/lib/eclipse下對應的目錄下即可。

文章開始!

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

$ cd (回到主目錄) 

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

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

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

$ make O=/home/xxx/linux-2.6.28-obj menuconfig (這裏我們要配置內核,並在~/linux-2.6.28-obj目錄下生成內核配置文件.config) (注意:這裏的xxx表示的是你的用戶名)

注意在這裏我們要選擇kernel hacking 配置菜單下的

"Compile the kernel with debug info" 和 "Compile the kernel with frame pointers"

 如下圖:

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 鍵開始編譯工程。注意,如果elipse提示說 工程is not clean ,那麼只需要在xterm下進入源碼樹目錄,輸入make mrproper就可以了。注意這裏編譯內核花費的時間取決於你的開啓選項的多少,所以在menuconfig時,儘可能的將不必要的選項去掉,這樣可以縮短編譯內核的時間。

。。。

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

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

$ qemu -s -S -hda ~/linux-0.2.img -kernel /home/xxx/linux-2.6.28-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.28-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.28-obj/vmlinux,如下圖所示:

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

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

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

 後面的啥查看寄存器,查看變量,都不用我多說了吧。享受調試內核的樂趣吧!

原文:http://www.cnblogs.com/yangnas/archive/2010/03/18/1688885.html

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