使用 VSCode 运行 Task 并自动 Attach Debugger

本文将讲述如何在 VSCode 中使用 Attach 模式 Debug 的时候,也能像 Launch 模式一样一键启动 Debuggee. 具体原理是使用 preLaunchTask 并将此 Task 的 isBackground 属性设置为 true.

VS Code Debug Protocol 描述了两种不同的 Debug 方式:Launch 以及 Attach. 他们分别对应了 VSCode 负责启动程序并 Debug,以及 VSCode 去 Debug 一个正在运行的程序,包括非本地的程序.

其中,Launch 模式的潜在含义是,VSCode 将负责管理 Debuggee 的生命周期,也就是说 VSCode 负责启动及停止,而这些操作对于用户而言就是按一下按钮. 反观 Attach 则是另一种设计:用户必须自行启动 Debuggee,可以在本地可以在远程,只要 Debugger 能够与之通信,而 VSCode 只负责将 Debugger 与 Debuggee 对接.

在本地开发本地运行本地调试的情况下,Launch 无疑是最好的选择,因为一旦配置完毕,今后 Debug 只需要一键启动及一键停止. 这种开发环境十分的理想化,尽管可以满足大多数需求,但当环境变得复杂时,Attach 模式将是无法避免的. 例如执行代码的机器一定是在远程,这常见于跨平台开发,包括在 Windows 上使用 WSL 做 Linux 开发,以及使用 QEMU + GDB 做内核开发. 尽管微软在近期对一些官方插件就 WSL 进行了优化,即可以使用 Launch 模式在 WSL 中运行程序,但第三方插件仍然不可避免地需要使用 Attach.

如何才能使 Attach 模式也像 Launch 模式一样,按下启动按钮就可以自动启动 Debuggee 和 Debugger 呢?原理上来说,这需要在运行 Debugger 之前后台运行 Debuggee. VSCode 中有一个 preLaunchTask 的功能,即用户可以指定在 Debug 之前需要运行的 Task. 这个 Task 可以是一段 Shell script 或是其他,具体详见 VSCode Task 的介绍. 这个功能常用于编译,例如 Debug C++ 项目的可执行文件之前先编译. 但当 preLaunchTask 是一个普通的 Task 时,Debugger 必须等待这个 Task 完成才会运行,而我们所期望的是这个 Task 与 Debugger 同时运行. 而这只需要将这个 Task 的 isBackground 属性设置为 true 即可.

现在唯一剩下的问题就是如何一键同时断开 Debugger 并停止 Debugee 了. 很不幸目前我并没有找到什么通用的办法. 但一些 Debug extension 会在断开 Debugger 之前自动终止 Debuggee. 例如微软的 C/C++ extension 就会自动终止 Debugee,而第三方的 Native Debug extension 就不会.

这种配置可以应付绝大多数开发情况了. 开发过程中依靠这些自动化脚本来节省操作,所节省的时间与精力固然有限,但有助于将注意力集中在开发本身而不是在启动终止程序的重复劳动上.

发表评论?

0 条评论。

发表评论


注意 - 你可以用以下 HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">