KGDB, QEMU === KGDB顧名思義就是Kernel GDB,可以除錯Linux kernel。想要試著實做的原因是之前在COSCUP2021聽了如何使用KGDB trace linux kernel的conference。一直想來實做看看,這篇紀錄我的實作過程。[參考 COSCUP 2021 KGDB conference](https://hackmd.io/@coscup/Bk8qLaw0d/%2F%40coscup%2FrJu8I6PCO) 本篇只會載入Linux kernel,並不會載入Rootfs。所以,Linux kernel會panic在因為無法載入Rootfs。 實作目標就是利用GDB把這個錯誤抓出來。 --- ## 環境: 1. HOST: Ubuntu 2. QEMU machine emulator and virtualizer 3. Linux kernel mainline [GITHUB網址](https://github.com/torvalds/linux) 4. Toolchain: arm-linux-gnueabi 5. GDB: arm-none-eabi-gdb 本次使用qemu模擬vexpress,當作目標平台。[參考 使用qemu建立一個linux核心和busybox根檔案系統](https://hackmd.io/@c_0KKCwzQE2rsd39mpvNQQ/rknxhDzvB) QEMU安裝就不介紹了,我是採用apt工具安裝。 --- ## 編譯Linux Kernel: 1. 下載Linux Kernel ```bash= git clone https://github.com/torvalds/linux --depth=1 ``` 2. 修改Linux kernel設定檔,加入以下KGDB描述: * 設定檔位置: ${Linux Kernel資料夾}/arch/arm/configs/vexpress_defconfig ```text= CONFIG_DEBUG_INFO=y CONFIG_GDB_SCRIPTS=y CONFIG_FRAME_POINTER=y ``` 3. 編譯Linux kernel ```bash= make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- distclean make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- vexpress_defconfig make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- all ``` --- ## 開啟QEMU: ```bash= qemu-system-arm -M vexpress-a9 -m 512M -kernel ${Linux Kernel資料夾}/arch/arm/boot/zImage -append "console=ttyAMA0 loglevel=8" -dtb ${Linux Kernel資料夾}/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -s -S ``` :::info -s : freeze CPU on startup -S : shorthand for -gdb tcp:1234 -dtb : device tree location -kernel : linux kernel image location ::: 這時QEMU會等待GDB連接。 ![](https://i.imgur.com/NhJt5kC.png) --- ## 開啟GDB 1. 新增另一個視窗,用GDB載入vmlinux: ```bash= arm-none-eabi-gdb vmlinux ``` :::info [參考 几种linux内核文件的区别](https://blog.csdn.net/hanxuefan/article/details/7454352) vmlinux: 為Linux Kernel最原始檔案 zImage: vmlinux經過GZIP壓縮過的檔案 uImage: Uboot專用Linux kernel檔案 ::: 2. 連上QEMU: ```bash= target remote localhost:1234 ``` ![](https://i.imgur.com/9sox7gk.png) 3. 在Linux Kernel panic的地方下中斷點: ```bash= b panic ``` 4. 執行: ```bash= c ``` 這時可以看到GDB視窗停在panic ![](https://i.imgur.com/eLEiPjc.png) 另一個QEMU視窗也可以看到Kernel執行到一半停下 ![](https://i.imgur.com/qp9zJFP.png) 5. 往回追看看Kernel為什麼panic ```bash= backtrace ``` ![](https://i.imgur.com/3TZ03S9.png) 原因是沒有指定Rootfs給Kernel掛載 --- qemu-system-arm -M vexpress-a9 -m 512M -kernel ../linux/arch/arm/boot/zImage -append "console=ttyAMA0 loglevel=8" -dtb ../linux/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic sudo qemu-system-arm -M vexpress-a9 -m 512M -kernel u-boot/u-boot -nographic -net nic -net tap ifconfig eth0 192.168.0.110 netmask 255.255.255.0