vscode 通过 remote-wsl 插件可调试 wsl2 中的用户态程序,但无法调试 linux 内核;内核调试需 qemu + gdb + vmlinux 方案。

VSCode 用 Remote-WSL 插件连接本地 Ubuntu 子系统
能连,但不是“直接调试 Linux 内核代码”,而是调试运行在 WSL 中的用户态程序(比如 C/C++ 应用、Python 脚本等)。想调试内核本身,得走 QEMU + GDB + vmlinux 路线,和 WSL 无关——WSL2 是微软定制的轻量级内核(linux-msft-wsl-5.15),不开放 /proc/kcore,也没 kgdb 支持。
Remote-WSL 插件是唯一正路,它让 VSCode 后端进程跑在 WSL 里,前端界面还在 Windows 上,文件路径自动映射,终端、调试器、扩展都走 WSL 环境。
- 必须装官方插件:
Remote - WSL(Microsoft 出品,IDms-vscode-remote.remote-wsl) - 确保 WSL2 已启用且 Ubuntu 发行版已安装完成,运行
wsl -l -v确认状态为Running - 不要手动配 SSH 或改
settings.json试图“远程连接”——Remote-WSL 不走 SSH,它用本地 Unix socket 通信,更稳更快 - 首次启动时右下角会弹提示“Reopen in WSL”,点它;或按
Ctrl+Shift+P→ 输入WSL: New Window
调试 C/C++ 程序时,launch.json 的关键配置项
调试器实际调用的是 WSL 里的 gdb,所以路径、符号文件、环境变量全得按 WSL 视角写,Windows 路径(如 C:\work\app)在这里无效。
-
program必须是 WSL 路径,例如/home/user/myproj/a.out,不是/mnt/c/work/app/a.out(虽然能访问,但 gdb 加载符号会失败) -
miDebuggerPath一般不用设,默认找gdb;但如果装了gdb-multiarch或交叉工具链,得明确填/usr/bin/gdb-multiarch -
externalConsole设为false,否则调试时弹出独立终端窗口,无法捕获输入/输出 - 如果程序依赖动态库,确保
LD_LIBRARY_PATH在env字段里设对,例如"LD_LIBRARY_PATH": "/home/user/libs:/usr/local/lib"
{
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "/home/user/myproj/app",
"args": [],
"stopAtEntry": false,
"cwd": "/home/user/myproj",
"environment": [],
"externalConsole": false,
"MIMode": "gdb"
}
]
}
常见错误:Unable to start debugging. Unexpected GDB output from command
这通常不是 GDB 崩了,而是路径或权限没对上。WSL 对 Windows 挂载区(/mnt/c)的文件执行权限默认受限,且符号表加载失败率高。
- 别把项目放
/mnt/c/xxx下调试——复制到/home/xxx再试 - 确认二进制有 debug 符号:
file app输出含with debug_info;没的话编译加-g - 检查
gdb版本:gdb --version,WSL 官方源的gdb 12+对 DWARF5 支持更好,老版本(如 9.x)可能解析失败 - 如果用
sudo启动程序,VSCode 调试器无权 attach,会卡在 “Waiting for debugger connection…” —— 改用普通用户权限运行目标程序
为什么不能用 WSL 调试 Linux 内核源码
WSL2 不是虚拟机,它用的是微软修改版的 Linux 内核(linux-msft-wsl-5.15),没有暴露传统内核调试接口:没有 /dev/kmem、没有 CONFIG_KGDB、vmlinux 符号也不公开发布。
- 你看到的
/lib/modules/$(uname -r)/build是空的,make modules_prepare会失败 -
gdb vmlinux可以加载,但没法 attach 到正在运行的 WSL 内核,因为没 kgdb 连接点 - 真要调试内核行为,得切到原生环境:QEMU 启动标准内核 +
-s -S参数,再用 VSCode +cppdbg连localhost:1234
想在 Windows 上做内核开发,最现实的路径是:WSL2 编译内核(用 make -j$(nproc)),然后用 QEMU 加载它调试——WSL 只当编译机,不当代理调试环境。











