使用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程式之上: