布景
上一篇文章介绍了如何调试树莓派 Linux 内核 根据 J-Link + openocd + gdb 调试树莓派 4B Linux 内核 ,其间笔者根据 gdb + openocd + jlink 完成了内核调试。对于 gdb 老手来说,这样就现已足够了。但是,并不是人人都是 gdb 老手,笔者这个从上到下学习 Linux 的人也不是,图形化调试可能才是比较适合新手的方法。
经过一番研讨后,笔者完成了经过 VSCode 来调试 Linux 内核,并将过程分享在本文中。
过程
准备源码 & 符号
将内核源码和符号拷贝到主机上,笔者在这里运用的是 Win 11 PC。源码和符号的获取可见上一篇文章。
装备 VSCode
安装 VSCode C 相关拓展
编写调试装备文件
将源码文件夹拖入到 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 调试选项卡的如下按钮后就能够开始调试了。
作用展现
调试启动后,点击下图中右上角的暂停按钮即可让体系停下来:
停下来之后能够检查各 CPU 上的 CALL STACK:
能够看到现在停在 cpu_do_idle,契合预期。
下面展现了笔者研讨【cat /proc/[pid]/maps 中匿名内存映射(如下图下方展现的 [heap] [vvar] 等 vma)的姓名是怎样得到的】过程中的调试截图。
$ 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]
从成果来看作用还是能够的,局部变量、调用栈、点击调用栈跳转源码等功能都正常作业。