在 cluster 模式下,worker 自动重启后,debugPort 会变更,需要手动重新 attach,对调试带来不小的麻烦。
之前的解决方案是,通过 egg-development-proxyworker 插件,启动一个 tcp 代理 worker 的调试接口。
存在的问题:
egg-development-proxyworker 的代理功能直接做到 egg-bin debug 即可egg-bin 就是 parent 进程,可以改下 egg-cluster 在 worker 重启后主动发一个 message 给 parent 通知新的 debugPort 即可egg-development-proxyworker 的功能实现有点复杂,无需多个代理,直接独立一个inspector-proxy 即可cc @eggjs/core 有什么建议
干!
@fengmk2 看最后那段,定下方案
根据最终讨论方案,更新了一楼,下面这段为原来的 RFC,备份用。
在 cluster 模式下,worker 自动重启后,debugPort 会变更,需要手动重新 attach,对调试带来不小的麻烦。
之前的解决方案是,通过 egg-development-proxyworker 插件,启动一个 tcp 代理 worker 的调试接口。
存在的问题:
egg-bin debug 会启动 master / worker / agent 三个调试端口,但通常情况下不需要。egg-development-proxyworker 的代理功能直接做到 egg-bin debug 即可egg-bin 就是 parent 进程,可以改下 egg-core 在 worker 重启后主动发一个 message 给 parent 通知新的 debugPort 即可egg-bin debug 不要传递 execArgv 而是作为 startCluster 的 options--agent// egg-bin debug 用法,然后转换为对应的 startCluster 参数
egg-bin debug --debug-port=5555 --agent=5554
对于 egg-cluster startCluster 的改造:
startCluster({}) 增加以下参数:debug {Boolean | Number} - 是否调试 worker,如果未指定端口,则默认端口为 9229(inspect) or 5858(debug)debugBrk {Boolean} - 是否调试 worker 时在第一行断点debugAgent {Boolean | Number} - 是否调试 agent,如果未指定端口,则默认端口 -2 即为 9227(inspect) or 5856(debug)debugAgentBrk {Boolean} - 是否调试 agent 时在第一行断点需讨论:
debug / debugAgent 是多态的,要拆分为 debugPort / debugAgentPort?@atian25 方案你来定。
proxyworker to egg-bin debugWebStorm 的 attach 原理,经过一些实验,猜测如下:
NODE_DEBUG_OPTION ,在 inspect 协议下会传递 --inspect-brk=XXXX,旧协议传递 --debug-brk=XXXX --expose_debug_as=v8debugexecArgv 来启动调试之前的修改导致的问题:
回归我们最终的诉求:
而之前的 egg-cluster 实现方式,实现过于复杂了,且导致 WebStorm 那问题解决起来麻烦,故:
egg-cluster 那个 PRdebug / debugAgent / debugBrk / debugAgentBrk 的支持egg-bin debug --proxy=9999egg-development-proxyworker 废弃掉proxyworker to egg-bin debug https://github.com/eggjs/egg-development-proxyworker/pull/7先关了,vscode 插件的后面另起
目前 egg-bin debug --inspect-brk 会同时导致 master / agent / worker 都被断点住,需要人工去一次
attach 3 个进程,有点略麻烦,有时候只希望断点 worker 或 agent。
改进思路:
Debugger.resume()--agent-brk --master-brk 两个参数,来断点其他两个进程。其他需要顺便优化的:
InspectorProxy 和上述逻辑context.debugPort 应该提供默认值上述问题已解决,参见 https://github.com/atian25/blog/issues/25
Most helpful comment
上述问题已解决,参见 https://github.com/atian25/blog/issues/25