本篇指南将教你如何调试Node.js应用程序和代码.
注意: --inspect
选项和检查器协议都是实验性的, 它们将来可能会被更改.
如果运行程序时开启了 –inspect 开关, Node.js进程会通过WebSocket监听那些由 检查器协议 定义的诊断命令, 默认情况下地址和端口是127.0.0.1:9229. 每个进程会被分配一个唯一的UUID(即通用唯一识别码, 此处的UUID形如: 0f2c936f-b1cd-4ac9-aab3-f63b0f33d55e).
检查器客户端必须知道并指定地址, 端口和UUID以连接到WebSocket接口. 完整URL为 ws://127.0.0.1:9229/0f2c936f-b1cd-4ac9-aab3-f63b0f33d55e
, 当然, 实际的URL要取决于实际的地址, 端口和UUID.
检查器带有一个HTTP终端用于处理被调试程序的元数据, 包括WebSocket URL, UUID和Chrome DevTools URL(Chrome DevTools指Chrome浏览器的开发者工具, 因为是个专有名词, 就不单独翻译了). 想获取到元数据, 要先发送一个HTTP请求到 http://[host:port]/json/list
, 会获取到一个形式如下的JSON对象; 然后用 webSocketDebuggerUrl
字段值作为URL直接连接检查器.
{
"description": "node.js instance",
"devtoolsFrontendUrl": "chrome-devtools://devtools/bundled/inspector.html?experiments=true&v8only=true&ws=127.0.0.1:9229/0f2c936f-b1cd-4ac9-aab3-f63b0f33d55e",
"faviconUrl": "https://nodejs.org/static/favicon.ico",
"id": "0f2c936f-b1cd-4ac9-aab3-f63b0f33d55e",
"title": "node",
"type": "node",
"url": "file://",
"webSocketDebuggerUrl": "ws://127.0.0.1:9229/0f2c936f-b1cd-4ac9-aab3-f63b0f33d55e"
}
对于一个在启动时没有使用 --inspect
的Node.js进程, 我们可以向它发送 SIGUSR1
信号使它开始监听调试信息(在Linux和OS X上可以这么做). 这种发送信号的方式, 在Node 7中会激活遗留的调试器API; 在Node 8及以后版本中会激活检查器API.
有几款商业性的和开源的工具可以连接到Node的检查器.
一款由Node.js基金会支持的, 使用 检查器协议 的命令行调试器.
有一个版本和Node绑定在一起了, 执行 node inspect myscript.js
即可使用.
最新版本可以独立安装(例如使用 npm install -g node-inspect
), 执行 node-inspect myscript.js
即可使用.
选项1: 在基于Chromium内核的浏览器中访问 chrome://inspect
. 点击”Configure”按钮, 确保你需要的地址和端口已经在列.
选项2: 复制 /json/list
的输出内容(上文提到过的JSON对象)中的 devtoolsFrontendUrl
, 或复制 “–inspect” 粘贴到Chrome中.
选项3: 安装NIM(Node Inspector Manager)这款Chorme插件:
https://chrome.google.com/webstore/detail/nim-node-inspector-manage/gnhhdgbaldcilmgcpfddgdbkhjohddkj
.vscode/launch.json
. 选择”Node.js”进行初始化设置.--inspect
. 如果想禁用, 在IDE注册表的 js.debugger.node.use.inspect
取消勾选即可.下面列出了各种调试相关的flag的作用.
node inspect
script.js
自Node 7.7.0以来, 遗留的调试器就被废弃了. 请使用 –inspect 和检查器来代替.
在Node 7或更早版本中, 如果使用了 –debug 或 –debug-brk 标记, Node.js会在一个TCP端口(默认为5858)上监听调试命令, 这些调试命令是由”V8 Debugging Protocol(V8调试协议, 此协议现已不再使用)”定义的. 凡是遵循此协议的调试器客户端都可以连接并调试正在运行的Node进程; 下面列举两个比较流行的调试器.
注意: V8调试协议已经不再维护了.
执行 node debug script_name.js
可以使你的代码在Node内置的命令行调试器下运行. 你的代码会运行在另一个由 --debug-brk
选项启动的Node进程中, 而最初的那个Node进程会执行 _debugger.js
的代码并连接到你要调试的代码.
用Chrome DevTools调试你的Node.js代码, 并通过一个中间进程将Chromium使用的”Inspector Protocol(检查器协议)”转换为Node.js使用的”V8 Debugger protocol(V8调试器协议)”