02月26, 2019

在VSCode中使用WSL进行gdb调试

注:现在已经有了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"
            }
        }
    ]
}

本文链接:https://debug.fanzheng.org/post/use-WSL-gdb-to-debug-on-vscode.html

-- EOF --

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。