---
# System prepended metadata

title: 'KGDB, QEMU'

---

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 