使用vscode+qemu在线调试内核

前面的文章介绍了如何使用QEMU仿真ARM,QEMU自带GDB Server可以很方便的调试内核,非常有利于学习。

GDB调试

ubuntu上安装gdb

sudo apt-get install gdb-multiarch

gdb-multiarch是多架构版本,可以通过set architecture aarch64指定架构

QEMU参数修改添加-s -S

#!/bin/bash

source/qemu-7.2.0-rc1/build/aarch64-softmmu/qemu-system-aarch64 \
    -nographic \
    -M virt \
    -cpu cortex-a57 \
    -smp 2 \
    -m 1G \
    -kernel source/linux-6.0.9/build/arch/arm64/boot/Image \
    -append "nokaslr root=/dev/ram init=/linuxrc console=ttyAMA0 console=ttyS0" \
    -s -S

-s 表示启用 GDB 服务,-S 表示启动时停止 CPU,等待 GDB 连接。

-s 可以指定调试端口,如 -s tcp::8888。没有指定的默认情况下,端口号是 1234

执行后会卡住,等待连接。

进入内核目录linux-6.0.9/build执行

gdb-multiarch --tui vmlinux

其中,--tui(Text User Interface) 用于启用 TUI 模式,它会在 GDB 命令行界面中显示一个类似于文本图形界面的交互界面,方便用户进行调试操作。vmlinux 是 Linux 内核的符号表文件,包含了内核函数、变量等符号信息。几个内核产物可以参考文章 关于内核镜像文件的不同。

cd linux-6.0.9/build
gdb-multiarch --tui vmlinux
(gdb) set architecture aarch64
The target architecture is set to "aarch64"
(gdb) target remote localhost:1234
Remote debugging using localhost:1234
(gdb) b start_kernel
Breakpoint 1 at 0xffff000011bf0470 (2 locations)
(gdb) c

即可在内核入口函数打断点。

VSCode调试

虽然已经有初步的GUI,但是看代码跳转等还是不够方便,我们使用vscode进行加强。使用vscode ssh内虚拟机,打开工程,详细使用教程参看 vscode离线安装与使用技巧 - 小满的博客 - 博客园 (cnblogs.com)

一定要先安装C/C++插件

创建配置文件

将我已经写好的配置粘贴进去

{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Linux-6.0.9",
            "type": "cppdbg",
            "request": "launch", 
            "program": "/home/lichong/Study/qemu/source/linux-6.0.9/build/vmlinux",//vmlinux路径
            "args": [],//启动参数,如果需要记录日志可以自己增加参数。因为gdbsever已经有了参数,这里可以不用设置
            "stopAtEntry": true,//会自动停在main,不需要则设置为false
            "cwd": "${workspaceRoot}",
            "environment": [],
            "externalConsole": true,
            "MIMode": "gdb", //运行模式
            "logging": {
                "moduleLoad": false,
                "engineLogging": false,
                "trace": false
            },
            "setupCommands": [ //命令
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description": "set architecture aarch64",
                    "text": "set architecture aarch64",
                    "ignoreFailures": true
                }
            ],
            "miDebuggerPath":"gdb-multiarch",//工具链gdb
            "miDebuggerServerAddress":"localhost:1234"//远程端口

        }
    ]
}

vmlinux路径按照实际情况修改保存。

先在终端执行qemu,再vscode内打开代码打断点init/main.c:934,现在就可以运行了

开始GDB

现在就可以愉快的调试了

开始调试

关于VSCode GDB的操作不再赘述,可以参考VSCode C/C++(gdb)调试指南_vscode gdb调试-CSDN博客

总结

内核因为太过底层,在实体板子上在线调试也存在困难,通过借助QEMU可以非常方便的在线调试,对于学习内核学习代码是很好的主力

posted @ 2024-06-14 16:53  小满的博客  阅读(85)  评论(0编辑  收藏  举报