更新要点
有些开发者朋友向我们抱怨说:在对远程Linux主机或者WSL(Windows Subsystem for Linux)进行调试时所需要做的配置还是比较麻烦。
我们听到了。
现在,在Visual Studio 2019 v16.6 Preview 2中,我们引入了一个新模板,用来简化GDB调试工作。要点如下:
> 现有的所有调试配置(关于cppdbg)都可以一如既往地正常使用。
> 当你添加一台新的Linux主机或者WSL的调试配置时,cppgdb的新模板将会默认被使用。
> 你可以通过阅读调试器帮助文档了解有关新模板的所有架构(schema)信息,这其中比较重要的两点是:新模板的概述(Overview)和有关远程调试的常见问题(FAQ)。
> 注意:在Visual Studio 2019 v16.6 Preview 2中,你还需要手动地设置配置类型(将调试类型手动调整为cppgdb)。
关于新的cppgdb模板
有些开发者觉得旧的调试配置太过详细,容易让人感到困惑,并且没有对应的文档。由此,我们添加了一个新的cppgdb模板,并将配置项做了相当的简化,如下图所示:
新的设置项[debuggerConfiguration]指定默认情况下使用哪种调试工具。在Visual Studio 2019 v16.6中,我们只能将它配置为gdb,因为目前只有它被支持。
gdbPath: 用来指向gdb的路径
cwd: 用来指向程序运行目录
preDebugCommand: 这是一个新的配置项,用来允许Linux指令可以在调试器启动之前运行。
接下来:对gdbserver的顶级支持
在Visual Studio 2019 v16.5及以上版本中,你可以手动配置[launch.js]来使用gdbserver来调试CMake工程。在即将到来的新VS版本VS版本中,我们将对gdbserver提供顶级支持,从而使用我们新的cppgdb模板。这样你就可以通过[debuggerConfiguration]来选择gdbserver并轻松配置gdbserver的路径或者指向gdb的本机路径。
有关远程调试场景的常见问题
我们经常收到一些关于Linux和WSL调试的问题,下面是一些比较常见的问题。
如何向被调试的程序传入参数?
可以通过[args]数组来向被调试程序传递命令行参数,如下所示:
如何设定环境变量?需要将我在CMakeSettings.json设定的变量重新设定到环境变量中吗?
在Visual Studio 2019 v16.5及以上版本中,在CMakeSettings.json中指定的调试目标将会被自动启动。你可以将CMakeSettings.json定义的变量当做环境变量来使用(例如,构建路径等),其语法为:”${env.VARIABLE_NAME}”。
你也可以通过将CMakeSettings.json中变量的值设置为null来取消变量的定义。
下面的例子演示了将一个新的环境变量(DISPLAY)传入到被调试程序,同时将CMakeSettings.json中定义的DEBUG_LOGGING_LEVEL设置为了null。
注意,旧的Linux/WSL的cppdbg配置依赖”environment”这一语法。
我希望在一台机器上编译,在另一台机器上调试,应该怎么做?
在CMakeSettings.json可以指定编译系统(例如一个WSL安装或者一台远程Linux主机)。远程调试系统可以通过修改launch.vs.json配置文件中的[remoteMachineName]。
默认情况下,[remoteMachineName]的值被同步为你的编译系统。只有当你需要在另一台系统上调试的时候才需要配置这个参数。最简单的修改这个参数的方法是使用IntelliSense(Ctrl + 空格)来显示一个远程连接的列表并从中选择一个。如下图所示:
还有另外一些可选的部署参数可以被用来分离编译系统和调试系统,具体请参考文档。
我希望能直接和底层的调试器进行交互,可以这样做吗?
Visual Studio可以通过命令窗口(Command Window)来执行一些自定义的GDB命令。方法如下:> 打开路径:视图 – 其他窗口 – 命令窗口> 执行:Debug.MIDebugExec <你需要执行的gdb命令>
我在使用GDB或者GDBServer时碰到了一些问题,应该如何进行troubleshooting呢?
可以通过[启用日志]来查看传送给GDB的所有命令,以及GDB的输出和每项命令的执行时间。
> 打开路径:视图 – 其他窗口 – 命令窗口
> 执行:Debug.MIDebugLog (/On[:] | /Off) [/OutputWindow]
选项说明:
> /On[:]: 启用MIEngine日志。可选地指定一个用于保存日志的文件。必须指定文件名或者必须使用”/OutputWindow”选项。
> /Off: 禁用MIEngine日志。如果将日志写入到文件,则这个文件将会被关闭。
> /OutputWindow: 将日志输出到输出窗口(Output Window)。
总结
通过使用新的模板,在远程Linux主机或者WSL上进行调试将是一件令人赏心悦目的事情。