QEMU GDB除錯核心

2021-08-16 08:42:43 字數 3081 閱讀 6363

gdb+qemu的方式是一種比較常見的除錯核心和驅動的方法,這裡寫的是我在安裝和使用gdb+qemu時碰到的一些問題的筆記總結。

環境準備

◆直接安裝

debian系統,可以直接apt-get install qemu

開始我使用的安裝包直接安裝的gdb,但是在使用過程中會報下面的錯誤

圖1opncls.c: in function 『bfd_fopen』:

bfd.h:529:65: error: right-hand operand of comma expression has no effect [-werror=unused-value]

#define bfd_set_cacheable(abfd,bool) (((abfd)->cacheable = bool), true)

opncls.c:263:5: note: in expansion of macro 『bfd_set_cacheable』

bfd_set_cacheable (nbfd, true);

cc1: all warnings being treated as errors

經查詢,在crash的changelog中發現由此問題對應的fix patch,但是要注意的是不能直接打上此補丁。此補丁是針對crash程式的補丁,我們需要針對報錯的問題,選擇patch中對應的地方修改。

crash的changlog**:

按照上面的修改後,編譯gdb就不會報錯誤了。但肯定還會是會報圖1中的錯誤,還需要參照鏈結修改gdb的原始碼gdb/remote.c檔案。

按照上圖中所示修改之後再編譯出來的gdb就不會報錯了。

用qemu+gdb來除錯核心和ko,當然我們需要準備如下:

◆帶除錯資訊的核心vmlinux

◆乙個壓縮的核心vmlinuz或者bzimage

◆乙份裁剪過的檔案系統initrd

編譯原始碼生成的檔案系統initrd.img-3.16.7-ckt7大小為147m,我們需要去掉一些不需要的檔案。initrd.img-3.16.7-ckt7檔案的格式為gzip格式的壓縮檔案,我們可以使用下面的方式解開:

cp /boot/initrd.img-3.16.7-ckt7

initrd.img.gz

gunzip initrd.img.gz

mkdir fs

cd fs

cpio -ivmd <

../initrd.img

首先就是解壓壓縮格式的檔案系統,解壓之後歸檔檔案通過cpio命令解開到fs資料夾下,我們可以對fs目錄下的檔案根據需要增加或刪除,以達到qemu除錯的需要。如果檔案系統太大,導致啟動時解壓檔案系統失敗,可以用strip命令去掉檔案系統中驅動模組的debug資訊。

在更改完之後,需要將fs目錄下的檔案再打包起來

find . | cpio -o -h newc | gzip >

initrd_test.img

上面的命令就是找到當前目錄下的所有檔案,並用cpio命令打包起來,然後用gzip命令壓縮,最終生成的檔案再上一級目錄下,檔名為initrd_test.img。

qemu啟動

qemu-system-x86_64 –m 2048m

上面是我啟動guest虛擬機器的命令,qemu命令後面跟的引數含義可以man qemu檢視手冊。

-m  為此guest虛擬機器預留的記憶體大小,如果不指定,預設大小是128m

-smp  表示guest虛擬機器的cpu的個數

上面兩個不是必須的引數選項。

-kernel 後面跟的是要除錯的核心bzimage

-initrd  後面跟的是檔案系統

-nographic  表示啟動的是非圖形介面的

-s 表示guest虛擬機器一啟動就會暫停

-s 表示監聽tcp:1234埠等待gdb的連線

qemu按上述方式啟動之後會暫停等待gdb的連線。

按照上圖的方式,vmlinux是帶符號資訊的未壓縮的核心,gdb啟動之後,執行target remote localhost:1234連線qemu中-s指定的埠。接下來就可以設定斷點了,後面的就和除錯使用者態程式的方法是一樣的了。

其它

通過qemu啟動的系統,往往都沒有掛載檔案系統,我們可以手動的mount

mkdir /proc

mkdir /sys

//mount -t proc none /proc

mount -t proc -o rw,nosuid,nodev,noexec proc /proc/

//mount -t sysfs none /sys

mount -t sysfs -o rw,nosuid,nodev,noexec sysfs /sys/

//mount -t cgroup none /sys/fs/cgroup

mount -t tmpfs -o ro,nosuid,nodev,noexec,mode=755 tmpfs /sys/fs/cgroup/

編譯優化選項

核心編譯的時候會使用編譯器的優化選項,如」-o2」,這樣使得編譯器為了優化而改變程式流程,會出現gdb除錯時與原始碼對不上,不利於除錯。但是如果直接修改核心源**頂層makedile裡面的cflags,去掉-o2,或者改為-o0,都會出現編譯失敗的問題。

我們可以針對某個特定的檔案去掉-o2優化選項,例如除錯cgroup相關的**,就可以修改kernel/makefile檔案,在檔案最後加上下面兩行即可:

cflags_cgroup.o = -o0

cflags_cpuset.o = -o0

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...

使用Qemu gdb來除錯核心

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

使用Qemu gdb來除錯核心

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