前言
之前寫了一篇關(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文件的配置
- 關(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)核版本的不同有所變化,因此最好手動搜索其具體的位置
- 打開編譯選項(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
- 打開編譯選項(xiàng)
DEBUG_INFOGDB_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


問題
目前調(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)試的!