1. 程式人生 > >使用gdb除錯linux核心

使用gdb除錯linux核心

使用Gdb+qemu除錯核心:

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

安裝qemu:

在ubuntu10.10下用# sudo apt-get install qemu下載最新的qemu版本

從已經裝好的作業系統ubuntu9.10_32.img的硬碟啟動,測試qemu是否可以執行:

# qemu –hadubuntu9.10_32.img


基本安裝結束後,開始進入除錯階段:

下載linux2.6核心,本實驗使用編譯的核心為linux2.6.30

# cd/Downloads

# tar –jxvf  linux2.6.30.tar.bz2

# cdlinux-2.6.30

# make menuconfig

# make

編譯後會在./arch/x86/boot/ 下生成bzImage檔案:

注:編譯時間很長,由於我沒有對核心進行裁剪,以後編譯時可以參考:

http://lamp.linux.gov.cn/Linux/kernel_options.html來對配置檔案進行裁剪,對不需要的模組要進行裁剪,可以採用先剪裁幾個模組後進行編譯,沒有錯誤後再進行裁剪編譯,最大程度上上保持核心配置的正確性,在這方面必須要加強,不能拿來個核心全都編譯,這樣時間和空間都是種浪費。


執行qemu,啟動除錯模式:

# qemu –S–kernel arch/x86/boot/bzImage –had ubuntu9.10_32.img –append “root=dev/had”


在命令中使用S引數,是freeze CPU ata startup。

系統跳出一個黑顯示介面,無任何內容,此時通過ctrl+alt+1與ctrl+alt+2可以切換,ctrl+alt+2是qemu控制檯,ctrl+alt+1是螢幕輸出。

現在我切換到qemu控制檯(ctrl+alt+2)

(qemu)gdbserver 1234


此時需要另開啟一個終端,進入linux2.6.30原始碼目錄下:

# gdbvmlinux

(gdb)target remote localhost:1234


這時就可以正常使用gdb編譯核心了

設定斷點break start_kernel,停在linux核心的第一個c程式之上: