使用Nodejs自带的Debug模块调试代码
前言
在Nodejs的早期版本,有一个很好的第三方调试库Node-inspector
,可以在Chrome浏览器上像调试本地JS代码一样调试Nodejs代码。但是从6.3版本开始,Nodejs内置了一个Debug工具,几乎废弃了Node-inspector
。这个内置的Debug工具是由V8/Chromium
团队直接开发的,提供了很多的高级特性使得无法继续支持Node-inspector
。
Nodejs新版本的内置的Debug工具功能很强大,今天我们就一起来学习下。
开启调试
语法
node inspect script.js
< Debugger listening on ws://127.0.0.1:9229/e1cc5573-672e-4290-92bb-bc712194173a
< For help see https://nodejs.org/en/docs/inspector
Break on start in index.js:1
> 1 (function (exports, require, module, __filename, __dirname) { /**
2 * Module dependencies.
3 */
debug>
只要在你的代码里使用debugger
打上断点,代码就会运行到断点处停止,就可以很方便地进行调试了。
调试步骤命令
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', 1)
,cb(...)
- 清除script.js
的第一行的断点
信息查看
backtrace
,bt
打印当前执行记录list(5)
打印当前执行代码的前后5行watch('expr')
增加一个表达式到观察列表unwatch('expr')
删除一个表达式watchers
列出所有观察列表,表达式和值repl
进入repl
环境exec expr
执行一个表达式在断点的上下文
执行控制
run
运行脚本restart
重新运行脚本kill
关闭脚本
变量
scripts
列出所有已经加载的脚本version
查看v8
的版本号
高级用法
V8
Inspector集成允许将Chrome DevTools
附加到Node.js实例中进行调试和分析。 它使用Chrome调试协议。
在启动Node.js应用程序时,可以通过传递--inspect
标志来启用V8 Inspector。 也可以为该自定义端口提供该标志,例如, --inspect = 9222
将接受端口9222上的DevTools连接。
要打破应用程序代码的第一行,请传递--inspect-brk
标志而不是--inspect
。
$ 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
上面是官网给的示例,但是经过我自己实践的时候,发现是如下的输出:
Debugger listening on ws://127.0.0.1:9229/77baeee2-4e24-4ee0-90a9-66023deb66b3
For help see https://nodejs.org/en/docs/inspector
然后我打开ws://127.0.0.1:9229/77baeee2-4e24-4ee0-90a9-66023deb66b3
这个地址发现打不开。
但是没关系,我们只要复制一下
chrome-devtools://devtools/bundled/inspector.html?experiments=true&v8only=true&ws=127.0.0.1:9229/dc9010dd-f8b8-4ac5-a510-c1a114ec7d29
将后面的ws=
后面部分替换为自己的127.0.0.1:9229/77baeee2-4e24-4ee0-90a9-66023deb66b3
,然后在chrome浏览器中打开即可。
还有一种比较简单的方法,就是打开chrome://inspect/#devices这个地址,然后在Remote Target中就可以看到你要调试的应用了,点击inspect
即可。
如果你想在第一行就停止下来,等待调试的话,可以使用
node --inspect-brk index.js
注意
默认的Source -> FileSystem
中的文件是空的,我们需要把要调试的文件的目录自己手动添加进来,否则的话,可能会报一些奇怪的错误,或者无法调试源码。