1. 程式人生 > >Vmware+gdb除錯Linux核心——工欲善其事,必先利其器

Vmware+gdb除錯Linux核心——工欲善其事,必先利其器

今天我終於忍受不了qemu的低速跟不可理喻的各種bug,開始尋找新的除錯核心的方法。然後想到了Vmware,那麼成熟的虛擬機器怎麼可能除錯不了核心。於是嘗試了一番,發現結果非常的棒!所以立馬奮筆疾書,把這個方法記錄下來。

         我們這裡主要分成幾個步驟:

                                                         1、vmware和linux的安裝

                                                         2、vmware編譯Linux核心

                                                         3、vmware和gdb主機的配置

                                                         4、測試

一、vmware和linux的安裝

1)VMware for Linux的安裝

官網下載地址:

              注:官網下載需要進行註冊在太平洋等網站可以找到,但由於csdn部落格url限制問題不能列出。

        下載完成之後,chmod a+x filename,然後在終端./filename執行安裝程式。接下來和win下的安裝基本一樣,這裡不作詳細介紹。

2)Linux虛擬機器的安裝

 安裝完vmware之後,我們在虛擬機器上安裝Linux系統。並在接下來的(二)中,在Linux虛擬機器上編譯新的核心。這裡的安裝和物理機安裝基本事一樣的,但是有點小技巧。由於我們接下來需要在Linux虛擬機器上編譯核心,所以這裡建議安裝Development,因為編譯的時候不僅需要make還需有其他庫的支援。我相信沒有願意在虛擬機器裡面再配一次yum源的。

所以我們在建立虛擬機器的時候,需要選擇建立之後安裝系統:

       

           虛擬機器建立完成後,通過虛擬機器的setting屬性。設定光碟掛載映象:

        

          然後啟動虛擬機器,就可以進行安裝。

二、vmware編譯Linux核心

         1)共享資料夾的製作

首先選擇右鍵中的install vmware tool,將自動把vmware tool的安裝檔案掛載到光碟。我們把裡面的.tar.gz

檔案拿出來,解壓並且執行裡面的安裝檔案。一路enter就ok了

然後我們在setting中繼續如下的設定:

         

上圖的意思是虛擬機器中/mnt/hgfs/HostFile 檔案對應主機中/home/sleipnir/Documents檔案實現共享

         2)核心編譯

我的版本是2.6.32.62。不同的版本編譯的方法事有一些差異的,比如2.6.32.61需要修改arch/x86/include/asm/ptrace.h的程式碼,不然編譯會報錯。下載下來之後,我們進行解壓,然後利用menuconfig進行模組的選擇,最後編譯。具體的命令列如下:

         tar xvf kernel-file.tar.gz       //解壓

         cd kernel-file

         make menuconfig               //利用menuconfig進行模組定義,具體在前面幾篇文章中進行了介紹

         make -j4 all                          //編譯-j4是使用多執行緒編譯,如果散熱不好的機子不建議使用。過熱會導致重啟

         make bzImage                     //壓縮核心

         make modules                     //編譯模組

         make modules_install        //安裝模組

         make install                         //安裝核心

注意:make install的時候,如果報錯ERROR:modinfo:could not find module XXXX可以不用管。reboot之後新核心可以正常執行。至於原理我們這裡提供一篇文章進行解釋:

三、vmware和gdb主機的配置

       完成了上面步驟之後,我們需要對虛擬機器做2步配置

 1)將虛擬機器上核心的編譯資料夾拷貝到主機的相同路徑下面。比如虛擬機器上的編譯檔案在/usr/kernel/linux-2.6.32.62。那這裡我們需要在主機的相同路經中把linux-2.6.32.62拷貝過來。拷貝的方法可以利用上面的共享資料夾。

       2)在主機上,配置vmware虛擬機器的配置檔案。配置檔案在虛擬機器的安裝資料夾中,以.vmx字尾結尾。往後面新增debugStub.listen.guest32="1",如果是64位的機器就改成debugStub.listen.guest64="1"

四、測試

       1)在主機上開啟Vmware(注:暫時不需要開啟虛擬機器)

       2)在主機上,進入到核心編譯資料夾(剛剛從虛擬機器拷貝過來的)

       3)gdb進入除錯模式

       4)(gdb)file vmlinux

             (gdb)target remote localhost:8832(注:這裡如果事64位機器則是8864埠)

               然後開啟虛擬機器

               效果如下:


       5)(gdb)b start_kernel

             (gdb)c

               效果如下: