布景

上一篇文章介绍了如何调试树莓派 Linux 内核 根据 J-Link + openocd + gdb 调试树莓派 4B Linux 内核 ,其间笔者根据 gdb + openocd + jlink 完成了内核调试。对于 gdb 老手来说,这样就现已足够了。但是,并不是人人都是 gdb 老手,笔者这个从上到下学习 Linux 的人也不是,图形化调试可能才是比较适合新手的方法。

经过一番研讨后,笔者完成了经过 VSCode 来调试 Linux 内核,并将过程分享在本文中。

过程

准备源码 & 符号

将内核源码和符号拷贝到主机上,笔者在这里运用的是 Win 11 PC。源码和符号的获取可见上一篇文章。

装备 VSCode

安装 VSCode C 相关拓展

基于 VSCode 的 Linux 内核图形化调试

编写调试装备文件

将源码文件夹拖入到 VSCode 中后,在源码根目录的 .vscode 目录创立文件 launch.json,内容如下:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Linux Kernel Debug",
            "type": "cppdbg",
            "request": "launch",
            "program": "C:\\Users\\xxx\\vmlinux",
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerServerAddress": "localhost:3333",
            "hardwareBreakpoints": { "require": true, "limit": 6 },
            "setupCommands": [
                {
                    "description": "为 gdb 启用规整打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description": "将反汇编风格设置为 Intel",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ],
            "miDebuggerPath": "C:\\SysGCC\\raspberry64\\bin\\aarch64-linux-gnu-gdb.exe"
        }
    ]
}

其间 miDebuggerServerAddress是上一篇文章中 openocd 开启的 gdb server 的调试端口,miDebuggerPath 是上一篇文章中安装的 gdb 的途径,hardwareBreakpoints 是强制使能硬件断点的装备。

开始调试

开启上一篇文章提到的 openocd 后,点击 VSCode 调试选项卡的如下按钮后就能够开始调试了。

基于 VSCode 的 Linux 内核图形化调试

作用展现

调试启动后,点击下图中右上角的暂停按钮即可让体系停下来:

基于 VSCode 的 Linux 内核图形化调试
停下来之后能够检查各 CPU 上的 CALL STACK:

基于 VSCode 的 Linux 内核图形化调试
能够看到现在停在 cpu_do_idle,契合预期。

下面展现了笔者研讨【cat /proc/[pid]/maps 中匿名内存映射(如下图下方展现的 [heap] [vvar] 等 vma)的姓名是怎样得到的】过程中的调试截图。

基于 VSCode 的 Linux 内核图形化调试

$ sudo cat /proc/497/maps
55803e0000-55804b4000 r-xp 00000000 b3:02 17803                          /usr/sbin/sshd
55804c3000-55804c7000 r--p 000d3000 b3:02 17803                          /usr/sbin/sshd
55804c7000-55804c8000 rw-p 000d7000 b3:02 17803                          /usr/sbin/sshd
55804c8000-55804cc000 rw-p 00000000 00:00 0
55a04a9000-55a04eb000 rw-p 00000000 00:00 0                              [heap]
......
7f9cc0c000-7f9cc0e000 r--p 00000000 00:00 0                              [vvar]
7f9cc0e000-7f9cc0f000 r-xp 00000000 00:00 0                              [vdso]
......
7feee1e000-7feee3f000 rw-p 00000000 00:00 0                              [stack]

从成果来看作用还是能够的,局部变量、调用栈、点击调用栈跳转源码等功能都正常作业。