使用 Clion + QEMU/GDB 遠(yuǎn)程調(diào)試Linux內(nèi)核

前言

之前寫了一篇關(guān)于使用 Clion 來閱讀linux源碼的文章《使用Clion 閱讀/修改/注釋 Linux 內(nèi)核源碼》,通過使用make -j12轉(zhuǎn)化為使用make -j12 vmlinux bzImage之后,大大的提高了編譯的速度,以及很大的降低了對CLion占用內(nèi)存的開銷,不會再出現(xiàn)卡頓,今天來配置Clion的Remote Debug功能以可以對Linux kernel進(jìn)行單步調(diào)試。

下面過程跳過了準(zhǔn)備linux內(nèi)核、qemu等等工具的準(zhǔn)備,僅僅介紹最核心的重要的配置。

試驗(yàn)環(huán)境:

  • Linux-kernel:5.14.2 -
  • QEMU:6.1.0
  • HOST:Ubuntu 20.04.3 LTS
  • Clion:2020.3.4
  • GDB:GNU gdb (Ubuntu 9.2-0ubuntu1~20.04) 9.2

一、修改.config文件的配置

  1. 關(guān)閉編譯選項(xiàng)CONFIG_RANDOMIZE_BASE,這是取消內(nèi)核內(nèi)存地址隨機(jī)化(KASLR),此配置的信息如下(可通過“/",搜索此信息):
  │ Symbol: RANDOMIZE_BASE [=n]
  │ Type  : bool
  │ Defined at arch/x86/Kconfig:2095
  │   Prompt: Randomize the address of the kernel image (KASLR)
  │   Depends on: RELOCATABLE [=y] 
  │   Location: 
  │     -> Processor type and features
  │ (1)   -> Build a relocatable kernel (RELOCATABLE [=y])    

因?yàn)镵ASLR的位置可能隨著內(nèi)核版本的不同有所變化,因此最好手動搜索其具體的位置

  1. 打開編譯選項(xiàng)CONFIG_DEBUG_SECTION_MISMATCH,如果關(guān)閉此選項(xiàng),那么內(nèi)核中僅僅被調(diào)用一次的函數(shù)會被編譯優(yōu)化為內(nèi)聯(lián)函數(shù),不利于調(diào)試,此配置信息為:
  │ Symbol: DEBUG_SECTION_MISMATCH [=y]
  │ Type  : bool
  │ Defined at lib/Kconfig.debug:384
  │   Prompt: Enable full Section mismatch analysis
  │   Location:
  │     -> Kernel hacking
  │ (1)   -> Compile-time checks and compiler options
  1. 打開編譯選項(xiàng) DEBUG_INFO GDB_SCRIPTS

可以直接使用./scripts/config -e DEBUG_INFO -e GDB_SCRIPTS -e CONFIG_DEBUG_SECTION_MISMATCH -d CONFIG_RANDOMIZE_BASE來完成上述工作

二、修改Makefile中的編譯優(yōu)化等級

編輯Makefile,將其中的-O2 替還為 -O1,我修改過后的樣子為:

export KBUILD_USERCFLAGS := -Wall -Wmissing-prototypes -Wstrict-prototypes \
                 -g -O1 -fomit-frame-pointer -std=gnu89
KBUILD_HOSTCXXFLAGS := -Wall -g -O1 $(HOST_LFS_CFLAGS) $(HOSTCXXFLAGS)

ifdef CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE
KBUILD_CFLAGS += -O1
else ifdef CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE_O3
KBUILD_CFLAGS += -O3
else ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
KBUILD_CFLAGS += -Os
endif

完成上述,兩處的配置,就可以根據(jù)《使用Clion 閱讀/修改/注釋 Linux 內(nèi)核源碼》來編譯內(nèi)核了

三、生成用于啟動kernel的磁盤文件

mkinitramfs -o ramdisk.img

四、配置用于gdb調(diào)試的腳本文件

echo "add-auto-load-safe-path path/to/linux/scripts/gdb/vmlinux-gdb.py" >> ~/.gdbinit

五、啟動qemu

進(jìn)入到內(nèi)核目錄,執(zhí)行:

qemu-system-x86_64 \
  -kernel arch/x86_64/boot/bzImage \
  -nographic \
  -append "console=ttyS0 nokaslr" \
  -initrd ramdisk.img \
  -m 1024 \
  -s -S

在這里很重要的一點(diǎn),那就是在debug的時候不要加上--enable-kvm -cpu host等參數(shù)

到這里,將會進(jìn)入暫停狀態(tài),再執(zhí)行:

$ gdb vmlinux
(gdb) target remote :1234
(gdb) b start_kernel
(gdb) c

就可以使用gdb進(jìn)行調(diào)試,如果出現(xiàn)斷點(diǎn)不停、啟動qemu-system-x86_64后直接啟動了內(nèi)核都是不正常的!

六、配置Clion

此時在執(zhí)行完qemu-system-x86_64后,就可以點(diǎn)擊debug按鈕,進(jìn)行調(diào)試

問題

目前調(diào)試并非完美,特別是對于inline函數(shù)的調(diào)試會出現(xiàn)無法進(jìn)入函數(shù)、在非斷點(diǎn)處停下等問題,這個問題和Clion無關(guān),因?yàn)樵贕DB命令行模式下調(diào)試也會出現(xiàn)同樣的問題!

不過瑕不掩瑜,只要好好的打斷點(diǎn),還是可以很好的調(diào)試的!

參考文獻(xiàn)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容