qemu + vscode图形化调试linux kernel

一、背景

使用命令行连接gdb 在调试时,虽然可以通过tui enable 显示源码,但还是存在设置断点麻烦(需要对着源码设置),terminal显示代码不方便,不利于我们学习;另外在gdb 下p命令显示结构体内容时,看起来也是很别扭,可以利用vscode+gdb-multiarch 调试qemu 仿真的arm64 linux 内核,这样查看源码,设置断点,查看变量信息也很快捷方便

二、依赖环境

vscode extensions 搜索安装GDB Debug

增加gdb config

json 文件中增加(主要是设置 elf, 以及gdb 的路径,远程gdb连接的端口号)

复制代码
{
    // 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": [
        {
            "type": "cppdbg",
            "request": "launch",
            "name": "kernel GDB",
            "program": "${workspaceFolder}/vmlinux",
            "cwd":"${workspaceFolder}",
            "MIMode":"gdb",
            "miDebuggerPath":"/usr/bin/gdb-multiarch",
            "miDebuggerServerAddress": "localhost:1234",
            "stopAtConnect": true,
        },
    ]
}

三、在vscode中启动调试

如果不知道如何qemu 调试内核的可以参考我之前的文档

无人知晓:qemu搭建arm64 linux kernel调试环境

无人知晓:qemu单步调试arm64 linux kernel

这里有些差异,gdb 加载vmlinux, remote target设置的部分需要换成从vscode设置

第一步启动qemu并等待调试:

复制代码
qemu-system-aarch64 \
    -machine virt,virtualization=true,gic-version=3 \
    -nographic \
    -m size=1024M \
    -cpu cortex-a72 \
    -smp 2 \ 
    -kernel Image \
    -drive format=raw,file=rootfs.img \
    -append "root=/dev/vda rw nokaslr" \
    -s \
    -S

第二步vscode启动调试 Run->Start Debugging

第三步启动调试,在init/main.c中start_kernel设置断点,然后点击调试工具栏的continue即可触发到断点,可以开启单步调试了

第四步如果在执行过程中连接,也是点击pause按钮,这时内核会停止执行,然后在vscode中设置断点,continue后触发断点vscode能正确显示断点位置及代码

相关推荐
会打莎士比亚的猴子16 分钟前
VSCode使用Remote-SSH连接服务器时启动失败glibc不符合
ide·vscode·ssh
明灯L35 分钟前
《深度剖析 Linux 权限管理:从基础到进阶,解锁系统安全密钥》
linux·运维·全网最全权限管理·小白0基础
不吃酸的柠檬1 小时前
如何在idea中新建一个项目
java·ide·intellij-idea
是覆盖对于变化1 小时前
ubuntu22.04 进入不了系统设置
linux·ubuntu
应以大橘为重1 小时前
interrupt子系统中的数据结构
linux·数据结构·驱动开发
kfepiza1 小时前
硬盘分区格式方案之 MBR(Master Boot Record)主引导记录详解 笔记250407
linux·windows·笔记
mzak1 小时前
已经安装了pip,出现pip command not found【解决方法】
linux·pip·python3
南风与鱼2 小时前
Linux 线程池
linux·线程池
Mazy.v2 小时前
Linux图形化界面
linux·运维·数据库
Linux技术芯2 小时前
#Linux内存管理# 在ARM32系统中,页表是如何映射的?在ARM64系统中,页表又是如何映射的?
linux