1. 程式人生 > >QEMU+GDB除錯核心

QEMU+GDB除錯核心

    用GDB來除錯使用者態程式是一個方便快捷的定位問題的方法,極大的縮短了除錯程式和定位問題的時間。而對於核心或者驅動ko的除錯或者我們想了解核心執行的某些過程,我們也可以藉助於gdb工具。

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

環境準備

QEMU安裝

Qemu的安裝比較簡單,可以選擇下載原始碼進行編譯;也可以下載包直接安裝。

◆下載qemu的地址

◆直接安裝

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

GDB編譯

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

圖1

    經過網上搜索,發現此問題有人遇到過,需要修改gdb的原始碼。具體可參見下面的連結:

    下載gdb-7.6的原始碼下來,進行編譯會報如下的錯誤:

opncls.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的補丁也可以在此網站裡下載到,我新作了一個補丁。

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

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

核心和檔案系統

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

    ◆帶除錯資訊的核心vmlinux

    ◆一個壓縮的核心vmlinuz或者bzImage

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

    下載一份核心原始碼進行編譯,就會生死vmlinux和bzImage,同時也會生成一個檔案系統。檔案系統可能會有幾百兆的大小,需要我們進行裁剪。

    編譯原始碼生成的檔案系統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

 -smp 2 -kernel linux-3.16.7-ckt7_dma_new/arch/x86/boot/bzImage -append "root=/dev/ram console=ttyS0 rdinit=/sbin/init mem=1024M" -initrd ./initrd_test.img -nographic -S -s

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

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

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

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

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

-initrd  後面跟的是檔案系統

-append 後面跟的是虛擬機器的cmdline

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

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

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

GDB連線

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

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


其它

mount檔案系統

    通過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 除錯核心

原文轉載自 https://blog.csdn.net/hoppboy/article/details/16886515 參考文章: http://blog.csdn.net/heli007/article/details/7187586  (比較推薦) http://

QEMU+GDB除錯核心

    用GDB來除錯使用者態程式是一個方便快捷的定位問題的方法,極大的縮短了除錯程式和定位問題的時間。而對於核心或者驅動ko的除錯或者我們想了解核心執行的某些過程,我們也可以藉助於gdb工具。    GDB+QEMU的方式是一種比較常見的除錯核心和驅動的方法,這裡寫的是我在

QEMU+gdb除錯Linux核心全過程

1、編譯原始碼(Linux kernel 4.6.2) make menuconfig 執行make menuconfig時報錯缺少庫檔案 需要安裝依賴庫 sudo apt-get install aptitude sudo aptitude i

使用gdb除錯核心錯誤資訊

配置gdb: Kernel hacking  --->     [*] Kernel debugging     [*] Compile the kernel with debug info 核心開發時有時候出現Oops,例如一個野指標會導致核心崩潰,

使用Qemu+gdb除錯核心

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

QEMU+GDB環境下除錯NOVA微核心

       為了更好的學習與瞭解一個OS微核心,瞭解微核心的程式碼如何執行十分必要,因此學會如何除錯觀察微核心的程式便是更好的學習與瞭解一個核心程式碼的開始。我學習的是Fiasco微核心系列中的基於x86體系的多核輕量級微核心NOVA,我們知道核心程式不能直接放在一般的ID

利用eclipse + qemu| Vmware + gdb 除錯linux核心

      繼續回到eclipse中,這時候我們在選單中選擇Run -> Debug Configurations ,這時候開啟一個配置頁面。然後我們在C/C++ Application上雙擊滑鼠,這時在右側的頁面彈出了debug配置選項,然後我們在project一欄選擇 linux-kernel ,在

如何使用gdb除錯android webkit核心程式碼

紅心地瓜 得益於指令碼的幫助,在Emulator中使用GDB除錯Native Code的設定非常簡單,比如我用gdb+gdbserver除錯webkit 1.  找到你的toolchain對應的gdb,在模擬器上是arm-eabi-gdb,在prebuild下,把它的目錄加到PATH裡面        

Linux核心分析之三——使用gdb跟蹤除錯核心從start_kernel到init程序啟動

作者:姚開健 原創作品轉載請註明出處 《Linux核心分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000 Linux核心(本文以Linux-3.18.6為例)的啟動在原始碼init資料夾裡的main.c

使用gdb除錯linux核心

使用Gdb+qemu除錯核心: 我們除錯核心需要一個叫qemu的虛擬機器,qemu虛擬的一個好處便是可以讓cpu處於凍結狀態,從而讓作業系統處於暫停狀態,這樣我們才能很方便的除錯核心。首先使用qemu安裝一個作業系統,再將該作業系統的核心換成我們要除錯的。 安裝qemu

gdb除錯命令及程式崩潰時的核心轉存core dump

1.gcc -g filename.c -o filename 需要生成帶除錯資訊的檔案 2.除錯   方式一:gdb filename 除錯file可執行檔案   方式二:>>gdb              >>file filename $gd

qemu建立虛擬機器,gdb除錯及網路配置

準備:  安裝映象iso,qemu source code,安裝編譯qemu必要的庫 準備,主要參考openwrt交叉開發環境,加上常用的軟體 sudo apt-get updatesudo apt-get install gcc g++ gfortran gdb vim

核心panic後使用GDB除錯

核心執行時若出現panic,可以根據EIT的值用GDB來定位出錯程式碼: 例如我的出錯程式碼的EIT的值為0x80cf7c00+0x6f,可以在GDB下用b或l方式來定位程式碼。 [email protected]:~/work/XXXXX$ gd

使用Qemu除錯核心(host=aarch64)

1、編譯qemu-system-aarch64 隨後將該目錄新增到PATH變數並source ~/.bashrc 2、 下載並編譯核心 3、安裝gdb和gcc-c++ 4、除錯核心(本機,也可以通過網路) qemu-system-aarch

linux核心除錯技巧四:gdb除錯+vmlinux

vmlinux是個elf檔案,它的符號表中包含了所有核心符號。 注意linux中很多檔案是沒有後綴的,比如我見到的這個elf檔案的檔名是“vmlinux-3.10.62”,沒有後綴。 既然是elf檔案

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

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

gdb除錯Linux核心

原理: gdb可以支援遠端的除錯,串列埠連線和tpc/ip網路連結兩種。 在Ubuntu 9.10Linux下面,virtualbox 作為虛擬機器,裝有待除錯的Linux系統。a.建立連結。 這裡選擇串列埠方式除錯。在virtualbox的虛擬機器配置中,把串列埠設

gdb 遠端qemu-arm除錯

把 c 編譯成 arm 指令的可執行檔案  /usr/bin/arm-linux-gnueabi-g++ hello.cpp  cat hello.cpp #include <stdio.h> void crash(){ char *a=0;

gdbqemu聯合除錯linux-4.15

說明 以前使用過eclipse除錯過核心,最近又想用gdb除錯核心,還是比較習慣使用命令操作,但是在搭建除錯核心的gdb和qemu過程中,遇到一個問題,想了很多辦法,最後直接感覺到官方下載最新的gdb

在Linux下執行Qemu模擬AArch64硬體除錯核心

環境說明: Fedora21 x86_64 ARM公司推出ARM V8架構後,全面進入64位CPU時代,可是目前市場上出現的裝置太少或者說價效比不高,但是又想做相關平臺下的開發,那麼可以考慮下使用qemu模擬器 安裝aarch64-qemu: $