使用Qemu gdb來除錯核心

2021-06-07 14:17:33 字數 2699 閱讀 4621

昨天聽別人講使用qemu和gdb來實現原始碼級核心除錯,今天試了一下,果然非常方便,現簡單的記錄一下。

qemu是乙個開源的虛擬機器軟體,能夠提供全系統的**,可以執行在多個平台上,並**多個別的平台。qemu虛擬機器是採用動態翻譯來實現cpu的**的,對硬體的依賴程度低,通過它提供的眾多引數,你能夠對虛擬的機器進行定製以滿足你的需求。

要想對核心進行除錯,那自然需要重新編譯核心了,編譯核心的具體方法這裡就不羅嗦了,需要注意的是在配置核心時,要將「kernel hacking"中的「compile the kernel with debug info"選上,否則沒有除錯資訊,gdb也難為無公尺之炊。

編譯好核心之後,我們還需要製作乙個rootfs作為qemu虛擬機器的硬碟,這個步驟可以通過qemu來完成,大致的步驟如下:

1. 建立乙個虛擬的硬碟

# qemu-img create foobar.img 8g  # 建立乙個8g的虛擬硬碟

2. 在虛擬的硬碟上安裝乙個linux系統

# qemu -hda foobar.img -cdrom ***.iso -boot d -m 512 -enable-audio -localtime 

# ***.iso為某linux的發行版本的iso,該命令就是要從iso啟動,並將系統安裝到foobar.img中

當然,其實也可以將init ram disk作為qemu的rootfs,但這時需要對initrd進行修改,如果你對initrd不熟悉的話,最好還是花點時間,做個rootfs,這個可以省去一些麻煩。

qemu虛擬機器只是提供了乙個虛擬的機器,使得程式執行在虛擬機器中如同執行真實的物理機器上一樣,除此以外,qemu還必須能夠對虛擬機器進行完全的控制,但qemu和gdb又是怎麼扯上關係的呢?這是因為qemu中內建了gdbserver,這使得qemu能夠和遠端的gdb進行通訊,通過遠端的gdb來控制qemu虛擬機器的執行,從而達到除錯的目的。具體的操作如下:

1. 切換到剛剛編譯的核心的路徑,然後啟動qemu

# qemu -kernel arch/x86/boot/bzimage -initrd /boot/initrd.img-2.6.31-22-generic -gdb tcp::1234 -s

# -kernel 用來指定核心,注arch/x86/bzimage是不帶除錯資訊的核心,vmlinux是帶有除錯資訊的核心

# -initrd 用來指定核心啟動時使用的ram disk,

# -gdb tcp::1234表示啟動gdbserver,並在tcp的1234埠監聽,-s表示在開始的時候凍結cpu直到遠端的gdb輸入相應的控制命令

2. 啟動gdb,並和qemu進行聯絡,然後你就可以像除錯應用程式那些除錯核心了

# gdb

(gdb) file vmlinux

(gdb) target remote :1234

(gdb) b start_kernel

(gdb) c

呵呵,是不是很簡單,下面再簡單的介紹一下gdb常用的一些除錯命令:

help:即時幫助,當你不太記得或不太熟悉某些命令時,乙個help就可以搞定

edit:在gdb中使用$editor對某個檔案進行編輯,在開始之前可以將$editor設定為自己喜歡的編輯器

list:列出被除錯程式當前上下文的源程式

make:相當於在shell中執行make,對工程進行編譯,編譯完成後使用run即可重新開始除錯

run:簡寫為r,開始執行被除錯的程式

break:簡寫為b,設定乙個斷點,該斷點可以為某個檔案的某行,也可是某個函式名,還可以是某個位址,

此外通過if引數還可以設定條件斷點

backtrace:輸出呼叫堆疊

info:檢視當前gdb的各種資訊,如斷點資訊,呼叫堆疊等

step:簡寫為s,單步執行,每次執行一行

源程式,會跟蹤進入函式

next:簡寫為n,單步執行,每次執行一行

源程式,不跟蹤進入函式

stepi:簡寫為si,單步執行,每次執行乙個指令,會跟蹤進入函式

stepi n:簡寫為si n,多步執行,每次執行n步指令,會跟蹤進入函式

nexti:簡寫為ni,單步執行,每次執行乙個指令,不跟蹤進入函式

finish:執行直到從當前函式返回

until:簡寫為u,執行直到所在的迴圈結束

continue:簡寫為c,繼續執行直到下乙個斷點或程式結束或gdb收到訊號

print:簡寫p,用來輸出某個變數的值,只輸出一次,輸出結構時可以設定「set print pretty on「,這樣觀察更方便 

display:觀察某個變數,每次執行時都顯示相應的變數

x:檢視記憶體,通過相應的引數來執行記憶體的位址和要顯示多少資料

x/i: 顯示

記憶體下一條指令

x/ni addr: 從

記憶體位址

addr處開始顯示n步指令

b uploadmgr.c:upload 表示在uploadmgr.c檔案的upload函式打上斷點。

b uploadmgr.c:12  表示在uploadmgr.c檔案的12行打上斷點.

nfo break可以檢視當前的斷點資訊

delete  1 表示刪除第乙個斷點  (用info break檢視的 斷點號)

delete 不帶引數是刪除所有斷點

gdb *** |tee newfile  可以將gdb過程中,儲存所有輸出到newfile中去

set args a b c

,設定除錯程式的引數

使用Qemu gdb來除錯核心

昨天聽別人講使用qemu和gdb來實現原始碼級核心除錯,今天試了一下,果然非常方便,現簡單的記錄一下。qemu是乙個開源的虛擬機器軟體,能夠提供全系統的 可以執行在多個平台上,並 多個別的平台。qemu虛擬機器是採用動態翻譯來實現cpu的 的,對硬體的依賴程度低,通過它提供的眾多引數,你能夠對虛擬的...

QEMU GDB除錯核心

gdb qemu的方式是一種比較常見的除錯核心和驅動的方法,這裡寫的是我在安裝和使用gdb qemu時碰到的一些問題的筆記總結。環境準備 直接安裝 debian系統,可以直接apt get install qemu 開始我使用的安裝包直接安裝的gdb,但是在使用過程中會報下面的錯誤 圖1opncls...

QEMU GDB 除錯核心

執行除錯技巧 參考資料 本篇文章用來qemu gdb除錯核心使用 root root runlinux chapter1 rootfs root fs rootfs img root rootfs.img rootfs img mount mnt rootfs kernel root root li...