使用 Chrome DevTools 调试远程物联网 Node.js 应用程序
使用 Chrome DevTools 调试远程物联网 Node.js 应用程序
如果您倾向于使用 Chrome* DevTools 而不是 Node.js* 内置的命令行调试工具来调试您的 JavaScript* 应用程序,您应该考虑以下两种选项之一。
- Chrome Inspect for Node — 如果您的物联网 Node.js 版本是6.3.0 或更高版本。
- Node Inspector — 如果您的物联网设备上的 Node.js 版本是6.2.x 或更低版本。
两者都支持连接到您主机开发系统上的 Chrome 浏览器中的 Chrome DevTools,以连接到运行在您无头物联网目标设备上的远程 Node.js 应用程序。更多 Node.js 调试选项可在调试 Node.js 应用文档页面中找到。
有关设置用于物联网 JavaScript 开发的远程 Node.js 环境的帮助,请参阅配套文章不使用 Intel® XDK 开发 Node.js* 物联网应用程序的替代方法。
注意: Atom* 的 Nuclide* 包“附加组件”在方便的开发环境中提供了对 Chrome DevTools 和 Node.js 应用程序的远程开发 的内置支持。您需要安装 GitHub* 的 Atom 编辑器 才能使用此工具。
使用 Chrome* Inspect for Node.js*
此调试技术要求
- 您的主机开发系统上安装有 Chrome 浏览器 55 或更高版本
- 您的物联网目标设备上安装有 Node.js 版本 6.3.0 或更高版本
如果您使用的是上述组件的旧版本,请考虑使用 Node Inspector 调试解决方案,该方案将在本文档的下一个主要部分进行介绍。
如果您的 Node.js 和 Chrome 版本满足上述要求,则无需在您的目标物联网设备或主机开发系统上安装任何其他软件。
配置 Chrome*
要使此功能正常工作,需要在 Chrome 浏览器中进行一些初始配置。在您的主机开发系统上打开 Chrome 浏览器,然后在 URL 地址栏中键入以下内容:
chrome://inspect
然后,确保选中“发现网络目标”复选框,并单击该复选框项右侧的“配置...”按钮(如下图所示)。
“配置...”按钮将弹出一个“目标发现设置”对话框,与下图类似。在此对话框中,您可以添加物联网目标设备的名称(或 IP 地址),并附加端口 9229。
在此示例中,我们使用了一个名为“de3815-paf2”的物联网设备,该设备通过 MDNS/Avahi/Bonjour 在本地网络上可寻址为“de3815-paf2.local”(有关配置 MDNS 的更多信息,请参阅此配套文章)。如果您的网络中有企业名称服务,该设备可能被命名为“my-iot-hostname.mycompany.com”,或者可能仅作为“my-iot-hostname”而无需域名限定符即可访问。使用任何可以响应“ping”命令的名称,或者如果设备 IP 地址是静态分配的并且您知道它永远不会改变,则使用该 IP 地址。
使用 Chrome* Inspect
配置并运行“chrome://inspect”后,您就可以在 Chrome DevTools 中开始调试您的远程物联网应用程序了。使用 ssh(或 PuTTY)登录到您的物联网目标设备,并通过键入以下命令以“调试模式”启动应用程序:
$ node --inspect --debug-brk <my-app-name>.js
在下面的示例中,要调试的应用程序名为 main.js
,位于 ~/node-debug-test
文件夹中。
此示例中调试的应用程序使用了 MRAA 库,该库要求以 root 身份运行此应用程序。因此,使用了 sudo -E bash
命令,该命令只是获取 root 提示符的一种便捷方式。
--debug-brk
选项会在第一行可执行代码处暂停您的应用程序。有关其他命令行选项,请参阅Node.js 调试文档页面。
注意: 不要打开长“chrome-devtools://devtools/...”URL!这仅在应用程序和 Chrome 位于同一系统上时才有效。在这种情况下,应用程序运行在您的物联网目标设备上,而 Chrome 运行在您的主机开发系统上。
应用程序以“调试模式”启动后,它应该会出现在您主机开发系统上的 Chrome 浏览器窗口的“chrome://inspect”标签页中。如果您没有运行 Chrome,请启动它,然后在 URL 地址栏中输入“chrome://inspect”以查看可调试设备和应用程序列表。
点击“chrome://inspect”标签页中显示的蓝色“inspect”链接。
在此示例中,您可以看到正在等待调试的应用程序列在“远程目标”标题下,后跟 Node.js 版本(v6.10.3)、应用程序名称(main.js)以及该应用程序在物联网文件系统上的位置(/home/ubuntu/node-debug-test/main.js)。
点击“inspect”链接应会打开一个 Node.js 的 Chrome DevTools 实例,与下图类似。显然,Chrome DevTools 窗口的详细信息会根据您正在调试的应用程序而有所不同。这是从 Intel® XDK 借用的“闪烁 LED”示例应用程序的视图。
从这里,您可以使用为 Node.js 定制的 Chrome DevTools 版本来单步执行、断点和检查应用程序中的对象。另请注意,您还可以访问 JavaScript 控制台以进行快速测试和调试。
有关使用 Chrome DevTools 的帮助,请参阅 Google Developers 网站上的这些文档页面。
注意: 如果您在应用程序中使用 console.log()
消息,它们应该会显示在 Chrome DevTools 控制台中,并且也会显示在您的远程物联网设备的 ssh 控制台中。如果您在发出一些 console.log()
消息后应用程序立即结束,这尤其有用,在这种情况下,这些消息将显示在 ssh 控制台中,但由于调试连接突然丢失,可能会从远程 Chrome DevTools 控制台中丢失。
使用 Node Inspector
此调试技术最适合与
- 您的主机开发系统上的 Chrome 浏览器
- 您的物联网目标设备上的 Node.js 版本 6.2.x 或更低版本
注意: 如果您的物联网目标设备运行的是 Node.js 版本 6.3.0 或更高版本,请考虑使用上一节介绍的 Chrome Inspect for Node 调试解决方案。它提供了更优越的调试环境,并且更容易设置。
安装 Node Inspector
在使用此技术之前,您必须先在您的物联网目标设备上安装 Node Inspector 节点模块。使用 ssh 或 PuTTY 登录到您的物联网目标设备,然后键入以下命令:
$ npm install -g node-inspector
除了 Chrome 浏览器之外,您的主机开发系统上无需安装其他软件。
启动 Node Inspector 调试会话
在您的物联网目标设备上的远程登录 shell 中,键入以下内容:
$ node-debug --debug-brk --cli --web-host 192.168.0.2 my-app.js
其中 --web-host
选项后面的 IP 地址是您的物联网目标设备的 IP 地址,my-app.js
是您将在物联网系统上运行和调试的 Node.js 应用程序的名称。
如果您不确定物联网设备的 IP 地址,请在物联网目标设备的远程登录 shell 中键入“ping $HOSTNAME
”,并使用该命令报告的 IP 地址。
在下面的示例中,要调试的应用程序名为 main.js
,位于 ~/node-debug-test
文件夹中。
此示例中调试的应用程序使用了 MRAA 库,该库要求以 root 身份运行此应用程序。因此,使用了 sudo -E bash
命令,该命令只是获取 root 提示符的一种便捷方式。
--debug-brk
选项会在第一行可执行代码处暂停您的应用程序,而 --cli
选项可确保 node-debug 不会尝试在您的远程物联网设备上自动打开浏览器。有关其他命令行选项,请参阅Node Inspector README。
应用程序以“调试模式”启动后,它会在上面示例中打印一个 URL(例如,“http://192.168.20.37:8080/?port=5858”)。将该 URL 复制到您的主机开发系统上的 Chrome 浏览器窗口中,以打开一个 Chrome DevTools 副本,如下图所示。
您看到的 Chrome DevTools 窗口的详细信息会根据您正在调试的应用程序而有所不同。这是从 Intel® XDK 借用的“闪烁 LED”示例应用程序的视图。
从这里,您可以使用 Chrome DevTools 来单步执行、断点和检查远程 Node.js 应用程序中的对象。另请注意,您还可以访问 JavaScript 控制台以进行快速测试和调试。
有关使用 Chrome DevTools 的帮助,请参阅 Google Developers 网站上的这些文档页面。
注意: 如果您在应用程序中使用 console.log()
消息,它们应该会显示在 Chrome DevTools 控制台中,并且也会显示在您的远程物联网设备的 ssh 控制台中。如果您在发出一些 console.log()
消息后应用程序立即结束,这尤其有用,在这种情况下,这些消息将显示在 ssh 控制台中,但由于调试连接突然丢失,可能会从远程 Chrome DevTools 控制台中丢失。