VSCode 调试 Egg 完美版 - 进化史 #25

背景

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 次,非常麻烦。

而今天,VSCode@1.12.0 正式支持了 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 的调试原理。

VSCode 调试 Egg 完美版 - 进化史 #25相关推荐

  1. java 创建日程到期提醒_苹果“快捷指令”日程播报完美版

    日程播报是一个常见于"快捷指令"中"早安/晚安"场景中的一项功能.通过与Win10日历时刻同步,可以非常方便的安排未来行程,避免遗忘重要事项.比如这样 每天早上 ...

  2. 调试Release发布版程序的Crash错误

    订阅 调试Release发布版程序的Crash错误 http://dingchaoqun12.blog.163.com/blog/static/116062504201152834814661/ 在W ...

  3. Vscode 调试arm64 linux内核

    对于linux内存系列的阅读和测试记录. https://zhuanlan.zhihu.com/p/105069730 https://zhuanlan.zhihu.com/p/510289859 搭 ...

  4. 同济大学计算机access,同济大学access答案完美版

    同济大学access答案完美版,个人原创,提交后全是满分 INSERT INTO Teachers VALUES ("600001", "杨梦", " ...

  5. G700android6,华为G700联通版小米MIUI V5 4.2.17刷机包4.2.1Rom完美版

    ROM名称  华为G700联通版刷机小米系统MIUI V5 4.2.17完美版 ROM制作者:    Ry09iu 安卓版本    Android4.2.1 ROM 启动器版本   MIUI V5 基 ...

  6. PCtoLCD2002完美版使用总结

    在学习使用ssd1306OLED屏时,需要在上面显示英文字符或汉字,这就需要使用到字库.对照原子的库一一对应,最终搞明白了PCtoLCD2002完美版如何使用,以及字库生成的方法. 说明: 1.  因 ...

  7. vscode 调试技巧|程序不是写出来的?是调出来的!

    常用的调试手段 作为程序猿的我可太清楚调试的重要性了,有一句话说的很对:程序不是写出来的,是调出来的.调试的方法很多,比如朴实的日志打印,打点的计量统计(比如 golang 的 pprof 信息),还 ...

  8. 使用 vscode 调试前端代码

    使用 vscode 调试前端代码 今天我们以webpack项目为基础讲解配置 复制代码 1. 安装插件 Debugger for Chrome 2. 修改 config/index.js 将devto ...

  9. (004)RN开发VSCode调试ReactNative项目

    1. 添加配置文件 点击小蜘蛛后,按第一步.第二步操作即可 接着选择调试平台☑️下面四个.点击OK,会生成一个launch.json文件并打开. 2. 添加断点 接下来,我们回到DEDUG,点击右边的 ...

最新文章

  1. wamp配置虚拟主机
  2. mybatis学习2之ResultMap结果集映射
  3. 博科b8网络版定位服务器位置,如何在企业服务器中采集奥维GPS定位设备的位置...
  4. WIndows下AppAche服务中调试php页面出现警告:Call to undefined function mysql_connect()
  5. 镜像电流源特点_9000大型地网变频大电流接地特性测量系统介绍
  6. 5年,14款近满分神作,这个独立团队打造了他们的游戏宇宙
  7. 频域分析方法的理解(信号、频谱、能量谱、功率谱、倒频谱、小波分析)(终极教程)
  8. JDK源码(7)-Boolean
  9. STM32中断应用总结
  10. 用随机投点法计算pi值matlab,用蒙特卡洛法求圆周率PI的近似值,其算法如下:使用随机函数Rnd,随机生成两个[0,1)之间的随机数,由此构成一个投点坐标(x,y),然后根据x...
  11. Atitit 深入理解软件的本质 attilax总结 软件三原则三次原则是DRY原则和YAGNI原则的折
  12. 笔记之_Java整理IO流
  13. MCU_segger-JLINK批处理脚本烧录工具-JFlash
  14. 磁珠的串联和并联分析:
  15. MAC直接的剪切快捷键
  16. 计算机界面无法全部显示,电脑屏幕不能完整显示软件界面怎么处理
  17. 【短链接】——新浪、百度、搜狐等官方长链接转短链接
  18. ubuntu平台下编译vlc-android视频播放器实践
  19. 《神经科学:探索脑》学习笔记(第3章 静息态的神经元膜)
  20. mysql 索引案例与索引策略

热门文章

  1. DotFuscator使用步骤
  2. Magento: 根据产品属性加载产品信息 Load A Category or Product by an Attribute
  3. BuddyPress安装指南
  4. 使用 jQuery Mobile 与 HTML5 开发 Web App (十四) —— jQuery Mobile 方法下
  5. MySQL数据库开发 (视频)
  6. WampServer的配置
  7. mysql基本表管理sql语句
  8. 华为机试——字符个数统计
  9. 用代码建立与数据库的连接 c#连sqlserver
  10. mysql-数据库的增删切换使用等操作