-
-
Notifications
You must be signed in to change notification settings - Fork 103
Description
背景
VSCode 早期版本,对 Node Cluster 的调试支持一直不是很友好,譬如:
- 开发期重启进程后,不支持重新 attach。
- Cluster 重启后 debugPort 会自增,VSCode 也不支持 attach 新端口。
- Egg 的 多进程模型 多了 Agent 处理公关事务,在开发期也有 3 个进程(master, agent, worker)。
那些折腾过的历史
黑暗时代
早在 2016 年时就开始的折腾:#14 和 #15 ,没有太好的办法。
青铜时代
然后 @okoala 写了 egg-development-proxyworker
主要思路是在 agent 里面启动一个 socket proxy 来动态代理 worker 的调试端口。
很巧妙的解决了自动重启后调试端口变化问题,但缺点是要开发者手动安装插件,并配置 vscode。
此时只能说达到可用的阶段。
黄金时代
接着,我写了 egg-bin debug 把 proxy 功能内置了,实现原理参见当时的 RFC 提案
并且提供了 vscode-eggjs 扩展来方便配置。
解决了:
- 自动 attach 重启后的 worker 新端口
- 自动生成 launch.json
对于一般应用开发者基本上已经非常易用了,但还存在以下问题:
- vscode 的
launch.json对同时 attach 多个的支持不是很友好,虽然有compounds。 - 默认只 attach worker,并且不支持启动期的断点,如果要
brk的话要手动 attach 3 次,非常麻烦。
而今天,[email protected] 正式支持了 Automatically attach debugger to Node.js subprocesses
因此我们之前的做法可以大幅简化了,没解决的问题也基本解决了,可以称为 完美版 了。
完美版的人生
文档已经更新:使用 VSCode 进行调试
安装 vscode-eggjs,并初始化调试配置(如果之前有则需删除 launch.json 文件)
然后简单的一个 F5 搞定~
简析
// .vscode/launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "Launch Egg",
"type": "node",
"request": "launch",
"cwd": "${workspaceRoot}",
"runtimeExecutable": "npm",
"windows": { "runtimeExecutable": "npm.cmd" },
// 启动我们的 egg-bin debug 并默认是 brk
"runtimeArgs": [ "run", "debug", "--", "--inspect-brk" ],
// 日志输出到 Terminal,否则启动期的日志看不到
"console": "integratedTerminal",
"protocol": "auto",
// 进程重启后自动 attach
"restart": true,
// 因为无需再 proxy,故改回原来的 9229 端口
"port": 9229,
// 自动 attach 子进程
"autoAttachChildProcesses": true
}
]
}其他
vscode 扩展生成的配置里面,还支持了单元测试的断点,配置如下:
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Egg Test",
"runtimeExecutable": "npm",
"runtimeArgs": [
"run",
"test-local",
"--",
"--inspect-brk"
],
"protocol": "auto",
"port": 9229,
"autoAttachChildProcesses": true,
"disableOptimisticBPs": false,
}
]
}完美版.最终版1
VSCode 1.22 支持了 Automatically Attach to Node.js processes,也就是如果你开启了这个的话,无需配置什么 launch.json,直接在 terminal 执行 npm run debug --inspect-brk 就会自动 attach 了。
补充
Egg 的调试,跟 Node 没啥区别,因此一定要了解 Node 的基础调试知识。
其中,--inspect-brk 是指在进程第一行就暂停,等待 attach,因此:
- master 先启动,在第一行会停住,需要你 attach master,才会往下走
- 接着 master 启动 agent,也是在第一行停住,需要 attach agent 才会往下走
- 最后 agent 启动完成后,worker 才开始启动,一样也是在第一行停住,需要 attach agent 才会往下走
上面这几个 attach,由于上面我们提到的 VSCode 的支持,只需要开启配置,即可无感知的一键 attach。
虽然如此,但作为开发者,大家还是需要理解 Node 的调试原理。