特性
Node V8.0开始支持使用Chrome Devtools调试工具来调试Node,非常的有用。
Debugger
稳定性:2 稳定
Debugger是基于TCP协议和内置调试客户端可访问的进程外Node.js调试实用程序。
可以在启动Node.js的时候,加上inspect参数,后跟脚本路径,进行调试。
|
1 2 |
// myscript.js console.log('test') |
|
1 2 3 4 5 6 7 8 9 10 11 |
$ node inspect myscript.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/bundled/inspector.html?experiments=true&v8only= true&ws=127.0.0.1:9229/3389ad9c-fc81-4b34-88ab-f4d8807f05f4 break in myscript.js:1 > 1 (function (exports, require, module, __filename, __dirname) { console.log('t est') 2 }); debug> |
node运行myscript.js文件,此时Debugger 会使用WebScoket默认在本地监听9229端口。启动成功后,可以在Chrome输入面板输出的随机URL(每次运行Node,URL都会变化)
Node.js的客户端调试工具并不是全功能的调试器,但可以进行简单的step(步入步出)和inspection(检查)。
可以在代码行中使用 debugger 进行断点调试
|
1 2 3 4 5 6 7 |
// myscript.js global.x = 5; setTimeout(() => { debugger; console.log('world'); }, 1000); console.log('hello'); |
当debugger运行时,第4行代码会有个断点
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
$ node inspect myscript.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/bundled/inspector.html?experiments=true&v8only= true&ws=127.0.0.1:9229/b2d1328f-d6db-408e-b87c-23ab100e0491 break in myscript.js:2 1 (function (exports, require, module, __filename, __dirname) { // myscript.js > 2 global.x = 5; 3 setTimeout(() => { 4 debugger; debug> cont < hello break in myscript.js:4 2 global.x = 5; 3 setTimeout(() => { > 4 debugger; 5 console.log('world'); 6 }, 1000); debug> next break in myscript.js:5 3 setTimeout(() => { 4 debugger; > 5 console.log('world'); 6 }, 1000); 7 console.log('hello'); debug> repl Press Ctrl + C to leave debug repl > x 5 > 2+2 4 debug> next < world break in myscript.js:6 4 debugger; 5 console.log('world'); > 6 }, 1000); 7 console.log('hello'); 8 }); debug> .exit |
next命令为继续执行下一行代码,repl 命令可以在当前执行上下文环境进行调试,比如查看变量值。
在没有输入命令时,按下回车键,将会执行上一条命令。
输入help可以查看更多可用命令。
Watchers
可以在调试时watch表达式及变量的值。
在每个breakpoint,watchers list中的每一条表达式会在当前执行上下文中即时显示结果。
开始监听:watch('my_expression')
取消监听:unwatch('my_expression')
监听列表:watchers
命令
Stepping
cont, c:继续执行
next, n:Step next
step, s:Step in
out, o:Step out
pause:pause runing code
Breakpoints
setBreakPoint(), sb():在当前行设置断点
setBreakPoint(line), sb(line):在指定代码行设置断点
:在functions里的第一个语句设置断点
setBreakPoint('fn()'), sb(...)
setBreakPoint('script.js', 1), sb(...):在script.js的第一行代码设置断点
clearBreakPoint('script.js', 1):取消设置script.js对应行的断点
断点也可以对尚未加载的file(module)进行设置
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$ node inspect test/fixtures/break-in-module/main.js < Debugger listening on ws://127.0.0.1:9229/4e3db158-9791-4274-8909-914f7facf3bd < For help see https://nodejs.org/en/docs/inspector < Debugger attached. Break on start in test/fixtures/break-in-module/main.js:1 > 1 (function (exports, require, module, __filename, __dirname) { const mod = require('./mod.js'); 2 mod.hello(); 3 mod.hello(); debug> setBreakpoint('mod.js', 22) Warning: script 'mod.js' was not loaded yet. debug> c break in test/fixtures/break-in-module/mod.js:22 20 // USE OR OTHER DEALINGS IN THE SOFTWARE. 21 >22 exports.hello = function() { 23 return 'hello from module'; 24 }; debug> |
Information
backtrace, bt:输出当前执行帧的回溯
list(5):列出当前代码的上下5行代码
watch(expr):添加watch
unwatch(expr):取消watch
watchers:列出watchers
repl:在当前执行上下文环境进行调试
exec expr:在当前执行上下文中执行表达式
执行控制
run:Run script
restart:Restart script
kill:Kill script
其它
scripts:列出所有已加载的scripts
version:显示V8的版本
高级用法
上面的介绍仅是在面板中调试,还是极为不便,如果像前端调试页面那样能够使用Chrome DevTools面板调试就非常方便了。
作为专为Node.js集成的V8调试工具,V8 Inspector支持将Chrome Devtools附加到Node.js实例进行调试,它使用的协议是Chrome Debugging Protocol
可以在启动Nide.js应用程序时,通过 --inspect 参数来启动V8 Inspector
如果需要在首行程序代码设置断点,可以传递参数 --inspect-brk
|
1 2 3 4 |
$ node --inspect index.js Debugger listening on 127.0.0.1:9229. To start debugging, open the following URL in Chrome: chrome-devtools://devtools/bundled/inspector.html?experiments=true&v8only=true&ws=127.0.0.1:9229/dc9010dd-f8b8-4ac5-a510-c1a114ec7d29 |
在上面的示例中,URL结尾的UUID dc9010dd-f8b8-4ac5-a510-c1a114ec7d29是及时生成的,不同的调试会话中都有所不同。
技巧
1. 端口被占用
Debugger默认使用9229端口,可以指定端口
node --inspect=9222
端口被占用时提示如下
|
1 2 3 4 5 6 7 8 |
$ node inspect myscript.js There was an internal error in node-inspect. Please report this bug. Timeout (2000) waiting for 127.0.0.1:9229 to be free Error: Timeout (2000) waiting for 127.0.0.1:9229 to be free at Timeout.setTimeout [as _onTimeout] (node-inspect/lib/_inspect.js:110:14) at ontimeout (timers.js:386:14) at tryOnTimeout (timers.js:250:5) at Timer.listOnTimeout (timers.js:214:5) |
2. 退出debug
键入两次CTRL+C或者输入.exit
|
1 2 3 |
debug> (To exit, press ^C again or type .exit) debug> .exit |
3. 查看Chrome调试信息
有时候在Node启动时,可能会输出很多的日志,导致刷掉Debugger调试URL无法复制。
此时可以在Chrome中访问 chrome://inspect/#devices ,找到相关的页面,点击Inspect打开调试面板


暂无评论