玩转 VSCode 调试 (JS & TS)
写在前面
说来尴尬,这周我们组内阶段回顾会议中聊到我们似乎并不怎么使用 VSCode 的 Debug 功能。公司的技术探索部门(第一次知道我们还有这个部门 )之前和我们组的 Tech Lead 交流 TypeScript 和 C++的交叉调试,我们突然意识到之前我们的 Debug 更多依赖于 logs 和测试,几乎没有用到过IDE的 runtime debug 功能。虽然自己对debug 工具本身并不执着,更希望通过分析而不是试验来寻找逻辑漏洞,不过 Tech Lead 觉得用不用是一回事,有没有就是另一回事了。我们还是决定完善一下我们的debug 设置,我们组大部分人用的都是 VSCode,这次就主要研究一下怎么在 launch.json 设置统一的调试启动选项。
Visual Studio Code
launch.json
VSCode的调试设置文件保存为 。最常用的 configuration request 种类是 和 ,大部分时候都可以直接使用 一键生成设置。
设置 launch nodejs
这个是相对最简单的用例,直接告诉debugger想要运行的目标文件就行了,选择这个选项之后就会直接运行server.js并进入debugging process。
sourcemap
VSCode提供的内置Node.js runtime 调试工具支持包括TypeScript 在内的很多可以 transpile 为 JavaScript 的语言。比如调试TypeScript程序时,虽然运行的是 JS 代码,调试环境会把动态响应反应在TS文件中,从而直观地显示代码进程。其实主要就是确保 debugger 能够通过 sourcemap 把 JS 代码映射到 TS 中去。可以通过在tsconfig.json 中加入 或者 生成sourcemap。
可以选择用 在每次运行时都自动编译。这么一来每次启动debugger时都会直接跳到TS中设置的断点中。
设置 launch mocha test
设置运行测试的debugger重点就是告诉 debugger 测试文件所在目录、mocha executable所在路径、以及其它mocharc的选项。比如:
设置 launch via npm
如果要启动 npm script 执行的命令,比如 ,就可以选择 配合 和 。其实用 几乎可以启动所有 task runner tool 启动的NodeJS 程序。
比如项目package.json中的 指令是启动一个 js 文件:
对应的 launch configuration 就是:
比较实用的一些attributes:就是程序启动的命令,还可以用 定义用哪个版本。比如要用node@12.3.0就要写:
如果要设置环境变量,可以用文件或者直接定义变量值:
设置 attach to process
将debugger 附在在某个正在运行的nodejs进程的做法有很多,最好用的就是设置成在用 or 运行程序时自动attach。
首先要在 中加入以下2个设置:
的另外2个选项 是自动attach所有node程序,不是很适合; 可以配合blacklist 和whitelist 使用(),限制哪些目录下的js文件运行时触发auto attach。选择了 之后每次运行 就会自动停在有设置断点的地方。
当然不用设置 autoAttach 也可以,运行 使进程开始,但是在attach之前不要运行程序,其间可以在process picker里选择该程序(一般都是9229端口,也可以通过或 修改)。当然也可以写在 launch.json中,然后用 开启后选择开始debug :
最后这种方式对调试 TS 也适用。 autoAttach 似乎对TS的兼容性不是很好(不确定是不是设置的不对,每次都会看到 ,可能是 TS 的路径需要设置…)
设置 launch browser
如果要调试在浏览器内部运行的代码,需要额外的插件支持,比如 Chrome 可以用 Debugger for Chrome。
启动本地web server之后选择 就会自动启动browser并进入8080口访问server,并停留在代码中设置的断点中。
拓展阅读
Debug Node.js Apps using Visual Studio Code