疯狂的技术宅 前端先锋 前端
在调试程序时老是会遇到各类挑战。Node.js 的异步工做流为这一艰巨的过程增长了额外的复杂性。尽管 V8 引擎为了方便访问异步栈跟踪进行了一些更新,可是在不少数状况下,咱们只会在程序主线程上遇到错误,这使得调试有些困难。一样,当咱们的 Node.js 程序崩溃时,一般须要依靠一些复杂的 CLI 工具来分析核心转储[1]。node
在本文中,咱们将介绍一些调试 Node.js 程序的简便方法。chrome
固然,没有哪个开发工具箱是不提供日志的。咱们倾向于在本地开发中的整个代码中放置 console.log 语句,但这并非生产中真正可扩展的策略。你可能须要进行一些过滤和清理,或者实施一致的日志记录策略,以便从中识别出重要的信息。express
要实施适当的面向日志的调试策略,能够用 Pino[2]或 Winston[3] 之类的日志记录工具。这些将容许你设置日志级别(INFO、 WARN、ERROR),它们容许你在本地打印详细的日志消息,同时在生产环境下仅打印严重的日志消息。你还能够将这些日志流式传输到聚合器或其余地方,例如 LogStash,Papertrail 甚至 Slack。浏览器
日志记录只能使咱们了解程序为什么没法按预期运行。对于复杂的调试,咱们将但愿使用断点来检查代码在执行时的行为。服务器
为此,可使用 Node Inspect。Node Inspect 是 Node.js 附带的调试工具。它实际上只是程序的 Chrome DevTools[4] 的实现,可以让你添加断点、控制分步执行、查看变量、并遵循调用堆栈。app
有两种方法启动 Node Inspect,但最简单的方法可能就是使用 --inspect-brk 标志来调用 Node.js 应用程序:框架
$ node --inspect-brk $your_script_name
Node inspector
启动程序后,前往 Chrome 浏览器中的 chrome://inspect URL 进入 Chrome DevTools。借助 Chrome DevTools,你能够拥有在浏览器中调试 JavaScript 时的全部功能。最有用的功能是检查内存的能力[5]。你能够获取堆快照[6]并配置内存使用状况,以了解内存的分配方式以及可能的方式及内存泄漏的状况。异步
许多现代 IDE 不但可以以某种方式启动程序,并且还支持调试 Node 程序。除了具备 Chrome DevTools 中的许多功能外,它们还具备本身的功能,例如能够建立日志点[7]并容许你建立多个调试配置文件。能够经过查阅有关检查器客户端的 Node.js 指南[8]来获取有关这些 IDE 的更多信息。ide
NDB
另外一种选择是安装 ndb[9],它是 Node.js 的独立调试器,和浏览器中的 DevTools 相似,就像一个隔离的本地调试器同样。它还有一些在 DevTools 中不可用的额外功能。它支持本地编辑,这意味着你能够修改代码并获得调试器平台直接支持的更新逻辑。这对于进行快速迭代很是有用。w
假设你的程序因为灾难性错误(例如内存访问错误)而崩溃。这些可能不多见,但确实会发生,特别是若是你的应用程序依赖于本机代码。
要调查这类问题,可使用 llnode[10]。当程序崩溃时,llnode 能够经过将 JavaScript 堆栈框架和对象映射到 C/C++ 端的对象来检查它们。为了使用它,你首先须要程序的核心转储。为此你须要使用 process.abort 而不是process.exit 来关闭代码中的进程。当你使用 process.abort 时,Node 进程在退出时会生成一个核心转储文件。
为了更好地理解 llnode 能够提供的功能,这个视频演示了其一些功能[11]。
除了上述全部之外,还建议用第三方软件包作进一步调试。
第一个被简单地称为 debug[12]。使用 debug,你能够基于函数名或整个模块为日志消息分配特定的命名空间。而后能够经过特定的环境变量选择将哪些消息打印到控制台。
例如,这是一个 Node.js 服务器,它正在记录来自整个程序和中间件栈的几条消息,例如 sequelize,express:application 和 express:router:
Debug 模块完整输出
若是咱们将 DEBUG 环境变量设置为 express:router 并启动相同的程序,则仅显示标记为 express:router 的消息:
Debug 模块过滤后的输出
经过以这种方式过滤消息,能够深刻研究程序单个部分的行为方式,而无需大幅度更改代码的日志记录。
trace[13] 和 clarify[14] 两个模块最好在一块儿配合使用。
trace 经过提供有关被调用的异步方法的更多详细信息来扩展你的异步栈跟踪,这是 Node.js 默认不提供的路线图。clarify 经过从特定于 Node.js 内部的栈跟踪中删除全部信息来提供帮助。这使你能够专一于仅针对程序的函数调用。
这些模块都不建议在生产环境中运行!仅在本地开发环境中进行调试时才应启用它们。