Table of Contents generated with DocToc
稳定性:2 - 稳定
Node.js 包含一个通过基于TCP协议访问的进程外的调试工具,并内置调试客户端。通过 Node.js 参数 debug
加上调试脚本的路径启动可以使用它;启动后将显示一个提示,指示调试器已启动:
$ node debug myscript.js
< Debugger listening on 127.0.0.1:5858
connecting to 127.0.0.1:5858 ... ok
break in D:\demo\node\my-blog\aa\debugger\myscript.js:1
> 1 x = 5;
2 setTimeout(() => {
debugger;
debug>
Node.js 的调试器客户端不支持所有功能,但简单的步骤(断点)和检查是支持的。
在脚本的源代码中插入 debugger
将在代码中该位置上进行断点。
x = 5;
setTimeout(() => {
debugger;
console.log('world');
}, 1000);
console.log('hello');
一旦调试器运行,断点将出现在第4行:
$ node debug myscript.js
< debugger listening on port 5858
connecting... ok
break in /home/indutny/Code/git/indutny/myscript.js:1
1 x = 5;
2 setTimeout(() => {
3 debugger;
debug> cont
< hello
break in /home/indutny/Code/git/indutny/myscript.js:3
1 x = 5;
2 setTimeout(() => {
3 debugger;
4 console.log('world');
5 }, 1000);
debug> next
break in /home/indutny/Code/git/indutny/myscript.js:4
2 setTimeout(() => {
3 debugger;
4 console.log('world');
5 }, 1000);
6 console.log('hello');
debug> repl
Press Ctrl + C to leave debug repl
> x
5
> 2+2
4
debug> next
< world
break in /home/indutny/Code/git/indutny/myscript.js:5
3 debugger;
4 console.log('world');
5 }, 1000);
6 console.log('hello');
7
debug> quit
repl
允许代码远程评估命令。next
步骤的下一行命令。键入 help
看看其他可用命令。
按 enter
未键入命令将重复以前的调试命令。
可以在调试时查看表达式和变量值。每个断点都会在当前上下文中评估观察列表中的每个表达式,并在列举断点的源代码前立即被显示。
通过键入 watch('my_expression')
来监视一个表达式, watchers
命令会将其打印在激活的监视器中。通过键入 unwatch('my_expression')
来移除一个监视器。
cont
,c
- 继续执行next``n
- 下一步step``s
- 介入out``o
- 退出介入pause
- 暂停运行代码(类似开发着工具中的暂停按钮)
setBreakpoint()
,sb()
- 在当前行设置断点setBreakpoint(line)
,sb(line)
- 在特定行设置断点setBreakpoint('fn()')
,sb(...)
- 设置断点在函数体的第一条语句setBreakpoint('script.js', 1)
,sb(...)
- 对 script.js 的第一行设置断点clearBreakpoint('script.js', 2)
,cb(...)
- 清楚 script.js 第一行的断点
也可以在未加载的文件(模块)中设置断点:
$ ./node debug test/fixtures/break-in-module/main.js
< debugger listening on port 5858
connecting to port 5858... ok
break in test/fixtures/break-in-module/main.js:1
1 var mod = require('./mod.js');
2 mod.hello();
3 mod.hello();
debug> setBreakpoint('mod.js', 23)
Warning: script 'mod.js' was not loaded yet.
1 var mod = require('./mod.js');
2 mod.hello();
3 mod.hello();
debug> c
break in test/fixtures/break-in-module/mod.js:23
21
22 exports.hello = () => {
23 return 'hello from module';
24 };
25
debug>
backtrace
,bt
- 当前执行帧的打印回溯list(5)
- 列出脚本源代码的 5 行上下文(前 5 行)watch(expr)
- 将表达式添加到观察列表中unwatch(expr)
- 从观察列表中删除表达式watchers
- 列出所有观察者及其值(自动列在每个断点上)repl
- 在调试脚本的上下文中打开调试器的 repl 来评估exec expr
- 在调试脚本的上下文中执行表达式
run
- 运行脚本(在调试器启动时自动运行)restart
- 重新启动脚本kill
- 终止脚本
scripts
- 列出所有加载的脚本version
- 显示 V8 引擎的版本
启用和访问调试器的另一种方式是在启动 Node.js 时添加 --debug
命令行标志,或向已存在的 Node.js 进程发送 SIGUSR1
信号。
一个进程一旦以这种方式进入了调试模式,它就可以被 Node.js 调试器连接使用,通过连接已运行的进程的 pid
或访问这个正在监听的调试器的 URI
:
node debug -p <pid>
- 通过 pid 连接进程node debug <URI>
- 通过类似localhost:5858
的 URI 连接进程
注意:这是一个实验功能
V8 lnspector 集成允许使用 Chrome DevTools(开发者工具) 附加到 Node.js 实例以进行调试和分析。
V8 lnspector 可以通过 --inspect
启动标志启动 Node.js 应用程序以启用它。它也可以定制端口,例如 --inspect=9222
将接受在端口9222 DevTools连接。
提供 --debug-brk
标志可以打破应用程序代码的第一行, --inspect
除外。
$ node --inspect index.js
Debugger listening on port 9229.
Warning: This is an experimental feature and could change at any time.
To start debugging, open the following URL in Chrome:
chrome-devtools://devtools/remote/serve_file/@60cd6e859b9f557d2312f5bf532f6aec5f284980/inspector.html?experiments=true&v8only=true&ws=localhost:9229/node