Bootstrap

vscode+kgdb+qemu调试linux内核(riscv 备忘笔记)

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盘驱动,不用的可以不设置)

启动后会进入以下界面:
kernel启动时等待kgdb远程连接

三、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
查看波特率信息

;