vscode+kgdb+qemu调试linux内核(riscv 备忘笔记)
本文是作者在调试linux的usb驱动模块时远程调试的备忘笔记
使用qemu启动一个riscv架构的linux内核
一、编译linux内核
内核版本5.10
make menuconfig
内核配置如下:
Linux Kernel Configuration
└─> Kernel hacking
└─> Generic Kernel Debugging Instruments
└─> KGDB: kernel debugger
└─> [*]KGDB: use kgdb over the serial console # 打开
└─> [*]KGDB_KDB: include kdb frontend for kgdb # 看需求
└─> [*]KGDB_KDB: keyboard as input device # 看需求
# CONFIG_FRAME_POINTER
Linux Kernel Configuration
└─> Kernel hacking
└─> Compile-time checks and compiler options
└─> [*]Compile the kernel with frame pointers # 打开
# CONFIG_STRICT_KERNEL_RWX
Linux Kernel Configuration5
└─> [ ]Make kernel text and rodata read-only # 关闭
Linux Kernel Configuration
└─> Kernel hacking
└─> Compile-time checks and compiler options
└─> Debug information
└─>(×)Generate DWARF Version 4 debuginfo # 打开
└─> [ ] Reduce debugging information # 关闭
└─> [*] Provide GDB scripts for kernel debugging # 打开
编译内核后生成Image和vmlinux文件。
二、使用qemu启动riscv-linux
本文不关注qemu的使用和如何启动linux,有兴趣可以去看这个教程。
基于qemu-riscv从0开始构建嵌入式linux系统
qemu启动参数
sudo ./qemu/build/riscv64-softmmu/qemu-system-riscv64 -cpu rv64 -M virt -m 2048M -nographic -usb -bios opensbi/build/platform/generic/firmware/fw_jump.bin -kernel ./linux/build-riscv64/arch/riscv/boot/Image -initrd ./rootfs_kvm_riscv64.img -append "root=/dev/ram rw kgdboc=ttyS0,115200 kgdbwait" -s -device qemu-xhci -device usb-host,vendorid=0x058f,productid=0x6387
其中,使用 kgdboc=ttyS0,115200 kgdbwait 开启kgdb调试,kgdbwait在需要调试内核启动过程时使用,它会使kernel在启动时等待kgdb连接,连接后继续kernel启动流程。
-s 表示可使用tcp远程连接测试,端口号问1234
-device qemu-xhci -device usb-host,vendorid=0x058f,productid=0x6387 该参数为qemu虚拟机设置使用 U盘(我需要调试U盘驱动,不用的可以不设置)
启动后会进入以下界面:
三、vscode远程连接kgdb调试
vscode连接教程
配置文件
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb)",
"type": "cppdbg",
"request": "launch",
"program": "/home/zh/kgdb/kvm/linux/build-riscv64/vmlinux", //源码中编译生成的vmlinux
"cwd": "${workspaceFolder}",
"MIMode": "gdb",
"miDebuggerPath": "/opt/riscv/bin/riscv64-unknown-linux-gnu-gdb", //根据不同的架构使用相应的工具链
"miDebuggerServerAddress": "localhost:1234" //qemu启动时使用的-s参数对应的端口号为1234
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
]
},
]
}
授权(若使用的是串口连接,则需要在vscode中对相应的串口设备授权):chmod 777 /dev/ttyUSB0
F5 运行后服务器端的kernel继续完成启动过程。
注:在连接之前要保证要调试的kernel处于gdb调试模式下,否则无法连接成功。
之后就可以在vscode中进行调试了
四、杂项
1、若是在qemu启动时未加参数“kgdboc=ttyS0,115200 kgdbwait”,则在启动后输入以下命令进入gdb模式
echo “ttyS0,115200” > /sys/module/kgdboc/parameters/kgdboc
echo g > /proc/sysrq-trigger
2、gdb连接tcp端口命令
target remote localhost:1234
3、gdb连接串口命令
(gdb) set serial baud 115200
(gdb) target remote /dev/ttyUSB0
stty -F /dev/ttyO0 ispeed 115200 ospeed 115200 cs8
设置波特率
stty -a -F /dev/ttyUSB1
查看波特率信息