前言

在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打上断点,代码就会运行到断点处停止,就可以很方便地进行调试了。

调试步骤命令

  • contc 继续执行
  • nextn 跳到下一个断点处
  • steps 进入某个函数
  • 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中的文件是空的,我们需要把要调试的文件的目录自己手动添加进来,否则的话,可能会报一些奇怪的错误,或者无法调试源码。

参考