调试代码
运行nodejs有许多可以调试代码的方法,以下介绍一些比较常见的nodejs调试方法供开发者借鉴。
命令行调试debugger
Nodejs提供了一个内建调试器来帮助开发者调试应用程序。想要开启调试器我们需要在代码中加入debugger标签,当代码执行到debugger标签时会自动暂停(相当于在代码中开启一个断点);其实此时NodeJS会内建一个客户端,命令行的输入的调试信息会通过 TCP 传送到内建客户端以达到调试的目的。
代码如下:
test.js
1
2
3
4
5
6
7
8
9
10
var test = 'test';
var http = require('http');
var url = require('url');
http.createServer(function (req, res) {
var path = url.parse(req.url).pathname;
debugger;
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end(path);
}).listen(1337, "127.0.0.1");
console.log('Server running at http://127.0.0.1:1337/');
在启动脚本时,添加第二个参数 debug:
调试代码的时候存在两个状态,一个是操作调试的位置,比如下一步,进入函数,跳出函数等,此时为 debug 模式;另一个是查看变量的值,比如进入循环中,想查看循环计数器 i 的值,此时为 repl(read-eval-per-line) 状态,在 debug 模式下输入 repl 即可进入 repl 状态:
按下 Ctrl+C 可以从 repl 状态回到 debug 状态下,我们也不需要记忆 debug 状态下有多少调试命令,执行 help 即可:
1
2
3
4
debug> help
Commands: run (r), cont (c), next (n), step (s), out (o), backtrace (bt), setBreakpoint (sb),
clearBreakpoint (cb),watch, unwatch, watchers, repl, restart, kill, list, scripts,
breakOnException, breakpoints, version
常用命令:
命令 | 解释 |
---|---|
cont, c | 进入下一个断点 |
next, n | 下一步 |
step, s | 进入函数 |
out, o | 跳出函数 |
setBreakpoint(), sb() | 在当前行设置断点 |
setBreakpoint(line), sb(line) | 在 line 行设置断点 |
查看更多命令。
NodeJS调试原理
1
Debugger listening on port 5858
可以访问下调试端口5858,会看到:
它告诉我们 nodejs 在打开文件的时候启动了内建调试功能,并且监听端口 5858 过来的调试命令。除了在命令行中直接调试之外,我们还可以通过另外两种方式去调试这个代码:
1
2
node debug <URI>, 通过 URI 连接调试,如 node debug localhost:5858
node debug -p <pid> 通过 PID 链接调试
如果我们使用 –debug 参数打开文件:
1
$ node --debug test.js
此时,nodejs 不会进入到命令行模式,而是直接执行代码,但是依然会开启内建调试功能,这就意味着我们具备了远程调试 NodeJS 代码的能力,使用 –debug 参数打开服务器的 nodejs 文件,然后通过:
1
$ node debug <服务器IP>:<调试端口,默认5858>
可以在本地远程调试 nodejs 代码。不过这里需要区分下 –debug 和 –debug-brk,前者会执行完所有的代码,一般是在监听事件的时候使用;后者不会执行代码,需要等到外部调试接入后,进入代码区。
默认端口号是 5858,如果这个端口被占用,程序会递增端口号,也可以指定端口:
1
2
$ node --debug-brk=6001 test.js
Debugger listening on port 6001
使用node-inspector
node-inspector 是一个可在webkit内核浏览器下进行nodejs调试的工具,其界面基本上跟chrome的调试工具一样,使用非常方便。
首先在全局环境安装node-inspector
1
$ npm install node-inspector -g
然后以命令行形式运行调试程序
1
$ node --debug-brk test.js
然后在新命令行运行node-inspector
1
$ node-inspector &
根据提示中的地址,打开http://127.0.0.1:8080/debug?port=5858 就可以看到,一个模拟Chrome调试窗口的页面,加载了node中的所有代码,具体的调试方式,就和Chrome一样了。
类似的调试工具还有Strongloop Node,有兴趣可以点击查看。
IDE调试
Eclipse 和 webstorm 的工具栏中都可以添加调试插件,详细步骤可以自行google。
更多调试工具
其他调试工具原理大同小异,也是通过 TCP 连接到 Nodejs 开启的内建调试端口。有兴趣的可以尝试:
Node Webkit Agent
主页 https://github.com/c4milo/node-webkit-agent 类似 Node Inspector, 通过 Remote Debugging Protocol 来实现 JS 的调试…
Brackets Editor, Theseus extension
Brackets 主页 http://brackets.io/ Theseus 介绍: http://blog.brackets.io/2013/08/28/theseus-javascript-debugger-for-chrome-and-nodejs/ 通过 Brackets 上的 Remote Debugging API 获取函数运行的信息生成调用栈的树和调用的统计. 可以用于调试浏览器端和 Node 服务端的 JS 代码.
node-dev
主页 https://github.com/fgnass/node-dev 极简自动监视源码保存刷新文件的命令行工具