@garygchai
2017-01-16T09:33:42.000000Z
字数 2128
阅读 4730
egg
刚接触 egg
的时候,很惊叹于它的简单易用,迫不及待想看看它是怎么实现的。然而,直接读源码是很累的,如果能边运行边认识它的运行过程,对源码的理解是非常有帮助的,这就需要用调试
。或许你会不屑,不就 debug 吗?有什么好讲的,但是,egg的调试远没想象的那么简单!
在开始学习 egg 调试之前,我们先认识一下 egg 的启动原理,这对下文的理解很有帮助。
egg 在启动的时候会启动3个进程,分别是master
、agent
和worker
。
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
Debugger listening on [::]:5858
就表示调试器在监听5858
端口的调试操作。
我们打开chrome通过访问http://127.0.0.1:8000/?port=5858进行调试。
我们通过chrome的调试面板操作,就可以调试master
进程的代码。
注意
: 指定port=5858
只能调试master
进程的代码,因为master进程默认监听5858端口。
如果master
进程调试结束,egg会接着启动agent
,此时监听的是5856
端口。
你需要访问http://127.0.0.1:8000/?port=5856才能调试agent
进程的代码
如果要调试agent
进行的代码,需要打开http://127.0.0.1:8000/?port=5856进行调试,因为agent
进程启动指定的是5856端口。
接下来就是worker
进程的debugger监听
worker
进程则要访问http://127.0.0.1:8000/?port=5859进行调试。
注意
: 生产环境workers会根据cpu数量启动多个,但是开发环境只会启动一个。
了解了上面几种调试方式,是不是还是觉得很难用呢!?下面介绍终极武器——vscode
。
调试
(就是长得很像蜘蛛的那个按钮),切换到调试界面 打开launch.json
,如果第一次打开就会生成一份launch.json
文件 launch.json
配置文件
{
// Use IntelliSense to learn about possible Node.js debug attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Start Egg",
"type": "node",
"request": "launch",
"program": "${workspaceRoot}/index.js",
"cwd": "${workspaceRoot}",
"runtimeArgs": [
"--debug"
],
"port": 5858
},
{
"name": "Attach Agent", // 对5856端口进行调试
"type": "node",
"request": "attach",
"port": 5856
},
{
"name": "Attach Worker", // 对5859端口进行调试
"type": "node",
"request": "attach",
"port": 5859
}
],
"compounds": [// 将三个任务组合一起运行
{
"name": "Debug Egg",
"configurations": ["Start Egg", "Attach Agent", "Attach Worker"]
}
]
}
大概解释一下这份配置,我们定义3个调试任务,分别是Start Egg
、Attach Agent
和Attach Worker
,监听的端口分别是5858
、5856
和5859
,我们通过compounds
将三个任务组合在一起运行。所以只要启动Debug Egg
便可以进行调试了
如果遇到相关问题,可以参考一下这篇文章:使用 vscode@1.6 断点调试 egg cluster