使用 Node.js 内置调试器进行调试

已完成

调试是一个多阶段的应用程序,通常遵循以下步骤:

  1. 识别程序中的 bug。
  2. 查找 bug 在代码中的位置。
  3. 分析 bug 发生的原因。
  4. 修复 bug。
  5. 验证修复是否有效。

在 Node.js 程序中发现错误后,你面临的第一个挑战就是在代码中找到错误所在的位置。 为实现这一点,最有效的方法之一就是分步运行代码,以便找出出错的位置。

断点

如果程序有成千上万行代码,那么逐步运行所有代码可能效率非常低。 在这种情况下,可以使用断点。 使用它可以在代码中的给定点中断程序正常执行并暂停。

使用断点,可以使程序正常运行,直到到达怀疑错误所在的关键代码部分。 然后可以切换到逐步执行。

根据调试器和代码编辑器,可以通过多种方式在代码中定义断点。

Node.js 检查模式

由于调试程序拥有对执行环境的完全访问权限,因此恶意行动者还可以使用它在你的 Node.js 应用程序中注入任意代码。 因此,Node.js 默认不允许调试正在运行的程序。 必须启用一种称为检查器模式的特殊模式才能允许调试。

你需要使用 --inspect 选项启动应用程序,以允许调试程序客户端将自身附加到应用程序并控制应用程序的执行。

默认情况下,使用 --inspect 选项启动 Node.js 时,它会在端口 9229 上侦听主机 127.0.0.1。 还可以使用语法 --inspect=<HOST>:<PORT> 指定自定义主机和端口。

重要

避免将 Node.js 调试器端口绑定到公共 IP 地址或 0.0.0.0。 否则,任何可以连接到你的 IP 地址的客户端都可能连接并控制你的 Node.js 应用程序。 这样一来,攻击者就可以在你的执行环境中远程运行任意代码。 此操作可能导致潜在的严重安全漏洞。

作为替代方法,可以使用 --inspect-brk 选项。 该选项的工作方式与 --inspect 相同,但会在代码开始之前中断代码执行。 这样,就可以附加调试器,花时间设置断点并单步执行代码以确定问题的根本原因。 需要针对以下情况进行调试时使用此 --inspect-brk 开关:

  • 争用条件。
  • 难以重现的间歇性问题。

在启用了检查模式的情况下启动你的应用程序后,可以使用任何兼容的调试程序客户端连接到你的应用程序进程。

调试程序客户端

若要调试应用程序,需要使用调试程序客户端。 调试程序客户端是连接到 Node.js 应用程序的程序,可用于控制应用程序的执行。 有许多调试程序客户端可用,但最常见的客户端是:

  • Visual Studio Code:与 Visual Studio Code 捆绑在一起的图形调试程序客户端。 在开发期间进行调试时,请使用此客户端。
  • node-inspect:与 Node.js 捆绑在一起的命令行调试程序客户端。 在生产环境中进行调试时,请使用此客户端。

内置调试程序

可以使用与 Node.js 捆绑在一起的命令行调试程序客户端 node-inspect 调试 Node.js 应用程序。 它是一个简单的调试程序,可用于设置断点并逐步运行代码。

node inspect <YOUR_SCRIPT>.js

node-inspect 调试器会在启用检查模式的情况下运行 Node.js,同时启动集成的交互式调试器。 它会在代码启动之前暂停执行。 应会看到调试器提示,指出它已成功启动。

node inspect myscript.js
< Debugger listening on ws://127.0.0.1:9229/ce3689fa-4433-41ee-9d5d-98b5bc5dfa27
< For help, see: https://nodejs.org/en/docs/inspector
< Debugger attached.
Break on start in myscript.js:1
> 1 const express = require('express');
  2
  3 const app = express();
debug>