注:现在已经有了VSCode Remote,该方案已经过时。
如果你是用的MinGW或者TDM-GCC编译你的程序,调试的时候直接用它们的gdb.exe即可,但如果是在WSL下编译运行,则需使用WSL下的Linux版gdb才行。下面说下VSCode怎么配置WSL下的gdb。
VSCode自己带了个debug的GUI壳,需要配合相应语言的交互层(例如cpptools插件)以及debug工具(例如gdb)使用。这是使用方法,写好launch.json
配置文件即可。
但如果想要使用WSL的工具进行调试,很多问题就产生了,尤其是路径问题。不过官方提供了一系列配置项用以解决这个问题,虽然麻烦一些,但还是不错的。对此,官方提供了一个教程。
使用WSL进行调试,关键在于两点:
- 使用bash执行gdb程序
- Windows与Linux路径相互转换
第一点比较容易理解,第二点要解释一下。这里面主要有以下两个路径需要进行转换:
- 把Windows的路径改成Linux路径以供gdb执行(包括可执行程序和代码文件,代码是用来定位),例如将
C:\a.out
修改成/mnt/c/a.out
,因为WSL里的gdb是没法用Windows路径的。 - 把Linux路径修改成Windows格式以供VSCode在调试时能正确寻找并定位到代码。例如将
/usr/include/c++/4.9/bits/regex.h
修改成C:\Users\fz\AppData\Local\lxss\rootfs\usr\include\c++\4.9\bits\regex.h
。
这里面涉及一个问题,即WSL在系统中的路径,这个要取决于你装WSL的方式。较老的Win10是在设置里安装的,因此WSL在%LOCALAPPDATA%\lxss\rootfs
,新的Win10都是在应用商店里装的,所以它以一个应用的方式存在,因此在%LOCALAPPDATA%\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs
。
新的路径非常麻烦,不同发行版还不一样,例如Debian的话就是类似
%LOCALAPPDATA%\Packages\TheDebianProject.DebianGNULinux_76v4gfsz19hv4\LocalState\rootfs
的路径。
注意:前者这个目录是的属性是“系统”,即“受保护的操作系统文件”,默认是隐藏的,可以手动输入路径打开。
而对于这两个路径的转换,官方给后者提供了一个sourceFileMap
的方式来实现,但是前者没有很好的办法,因为VSCode提供的环境变量例如${workspaceFolder}
的路径都是Windows格式的,不改的话会报这样的错误。使用绝对路径可以解决这一问题,但明显不是很好。我的解决方案是使用WSL workspaceFolder插件,它可以提供一个WSL格式的${workspaceFolder}
环境变量。
几种环境变量的使用:
- VSCode自带的:直接用,例如
${workspaceFolder}
- 插件提供的:加command修饰符,例如
${command:extension.vscode-wsl-workspaceFolder}
- 系统的:加env修饰符,例如
${env:LOCALAPPDATA}
了解了这些之后,配置launch.json
就容易了。一个典型的配置信息如下:
{
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
// "program": "${workspaceFolder}/bin/main",
"program": "${command:extension.vscode-wsl-workspaceFolder}/bin/main",
"args": [],
"stopAtEntry": false,
// "cwd": "${workspaceFolder}",
"cwd": "${command:extension.vscode-wsl-workspaceFolder}",
"environment": [],
"externalConsole": true,
"windows": {
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
},
"pipeTransport": {
"pipeCwd": "",
"pipeProgram": "C:\\Windows\\System32\\bash.exe",
"pipeArgs": ["-c"],
"debuggerPath": "/usr/bin/gdb"
},
"sourceFileMap": {
"/mnt/d": "D:\\",
"/usr": "${env:LOCALAPPDATA}\\lxss\\rootfs\\usr"
}
}
]
}
Comments
注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。