特性
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打开调试面板
暂无评论