[关闭]
@garygchai 2017-01-16T01:33:42.000000Z 字数 2128 阅读 4397

Egg debug教程

egg


刚接触 egg 的时候,很惊叹于它的简单易用,迫不及待想看看它是怎么实现的。然而,直接读源码是很累的,如果能边运行边认识它的运行过程,对源码的理解是非常有帮助的,这就需要用调试。或许你会不屑,不就 debug 吗?有什么好讲的,但是,egg的调试远没想象的那么简单!

egg的启动原理

在开始学习 egg 调试之前,我们先认识一下 egg 的启动原理,这对下文的理解很有帮助。
egg 在启动的时候会启动3个进程,分别是masteragentworker
master 负责启动其他进程的叫做 master 进程,基本不干活,只负责启动 agent 和 worker 和其他一些简单的工作;
agent 负责访问和处理一些公共的资源,并做为 master 与 worker 通信的桥梁;
worker 进程,一般是干活主力,监听端口,向外提供服务等等。

开始调试

下面介绍几种调试方式。

这种方式最简单,简单的调试可以使用,但是运行复杂的项目就有点蛋疼,效率太低。

这种方式如果不借助其他工具,只支持前端代码调试,不支持后端代码,但是我们运营后台这么多nodejs的后端代码,怎么能没有调试呢,这种方式也不太靠谱。

这是一款很强大的调试工具,主要是借助 chrome 来实现 nodejs 代码的调试。

不熟悉的童鞋先看一下 node-inspector 的教程
首先,启动一个node-inspector服务 $ node-inspector &
然后,启动项目文件 $ node --debug-brk index.js
或者,用一条命令代替上面两条命令 $ node-debug index.js
node-debug index.js

Debugger listening on [::]:5858就表示调试器在监听5858端口的调试操作。

我们打开chrome通过访问http://127.0.0.1:8000/?port=5858进行调试。
egg chrome debug

我们通过chrome的调试面板操作,就可以调试master进程的代码。
注意: 指定port=5858只能调试master进程的代码,因为master进程默认监听5858端口。

如果master进程调试结束,egg会接着启动agent,此时监听的是5856端口。
listen agent

你需要访问http://127.0.0.1:8000/?port=5856才能调试agent进程的代码
debug agent
如果要调试agent进行的代码,需要打开http://127.0.0.1:8000/?port=5856进行调试,因为agent进程启动指定的是5856端口。

接下来就是worker进程的debugger监听
listen worker
worker进程则要访问http://127.0.0.1:8000/?port=5859进行调试。
注意: 生产环境workers会根据cpu数量启动多个,但是开发环境只会启动一个。

了解了上面几种调试方式,是不是还是觉得很难用呢!?下面介绍终极武器——vscode

  1. 打开vscode,点击调试(就是长得很像蜘蛛的那个按钮),切换到调试界面
    open vscode debugger
  2. 点击打开launch.json,如果第一次打开就会生成一份launch.json文件
  3. 编辑launch.json配置文件
  1. {
  2. // Use IntelliSense to learn about possible Node.js debug attributes.
  3. // Hover to view descriptions of existing attributes.
  4. // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
  5. "version": "0.2.0",
  6. "configurations": [
  7. {
  8. "name": "Start Egg",
  9. "type": "node",
  10. "request": "launch",
  11. "program": "${workspaceRoot}/index.js",
  12. "cwd": "${workspaceRoot}",
  13. "runtimeArgs": [
  14. "--debug"
  15. ],
  16. "port": 5858
  17. },
  18. {
  19. "name": "Attach Agent", // 对5856端口进行调试
  20. "type": "node",
  21. "request": "attach",
  22. "port": 5856
  23. },
  24. {
  25. "name": "Attach Worker", // 对5859端口进行调试
  26. "type": "node",
  27. "request": "attach",
  28. "port": 5859
  29. }
  30. ],
  31. "compounds": [// 将三个任务组合一起运行
  32. {
  33. "name": "Debug Egg",
  34. "configurations": ["Start Egg", "Attach Agent", "Attach Worker"]
  35. }
  36. ]
  37. }

大概解释一下这份配置,我们定义3个调试任务,分别是Start EggAttach AgentAttach Worker,监听的端口分别是585858565859,我们通过compounds将三个任务组合在一起运行。所以只要启动Debug Egg便可以进行调试了

如果遇到相关问题,可以参考一下这篇文章:使用 vscode@1.6 断点调试 egg cluster

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注