Eclipse CDT + QEMU 調試linux核心

來源:互聯網
上載者:User

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

我的系統內容是:Ubuntu 9.10 + eclipse-cpp-galileo-SR1-linux-gtk.tar.gz + QEMU 0.11.0


關係統環境我要交代一下。因為在ubuntu下找不到eclipse cdt的源,所以要先 apt-get 一個eclipse
paltform然後在裡面選擇更新安裝cdt才能安裝成功。但在eclipse platform
裡更新比較容易失敗,所以我推薦大家安裝opensuse 11.0,在這裡面只要到eclipse.org下載一個eclipse c/c++ ide
,直接解壓便可運行。

文章開始!

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 ,選擇是,不再提示。

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

 

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

學習一下c語言:http://blog.csdn.net/bigloomy/article/category/841361

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.