作者:Julián Duque
翻译:疯狂的技术宅
原文:https://blog.heroku.com/debug…
未经容许严禁转载
在调试程序时总是会遇到各种挑战。Node.js 的异步工作流为这一艰巨的过程减少了额定的复杂性。只管 V8 引擎为了不便拜访异步栈跟踪进行了一些更新,然而在很少数状况下,咱们只会在程序主线程上遇到谬误,这使得调试有些艰难。同样,当咱们的 Node.js 程序解体时,通常须要依附一些简单的 CLI 工具来剖析外围转储。
在本文中,咱们将介绍一些调试 Node.js 程序的简便办法。
日志记录
当然,没有哪一个开发工具箱是不提供日志的。咱们偏向于在本地开发中的整个代码中搁置 console.log
语句,但这并不是生产中真正可扩大的策略。你可能须要进行一些过滤和清理,或者施行统一的日志记录策略,以便从中辨认出重要的信息。
要施行适当的面向日志的调试策略,能够用 Pino 或 Winston 之类的日志记录工具。这些将容许你设置日志级别(INFO
、WARN
、ERROR
),它们容许你在本地打印具体的日志音讯,同时在生产环境下仅打印重大的日志音讯。你还能够将这些日志流式传输到聚合器或其余中央,例如 LogStash,Papertrail 甚至 Slack。
应用 Node Inspect 和 Chrome DevTools
日志记录只能使咱们理解程序为何无奈按预期运行。对于简单的调试,咱们将心愿应用断点来查看代码在执行时的行为。
为此,能够应用 Node Inspect。Node Inspect 是 Node.js 附带的调试工具。它实际上只是程序的 Chrome DevTools 的实现,可让你增加断点、管制分步执行、查看变量、并遵循调用堆栈。
有两种办法启动 Node Inspect,但最简略的办法可能就是应用 --inspect-brk
标记来调用 Node.js 应用程序:
$ node --inspect-brk $your_script_name
启动程序后,返回 Chrome 浏览器中的 chrome://inspect
URL 进入 Chrome DevTools。借助 Chrome DevTools,你能够领有在浏览器中调试 JavaScript 时的所有性能。最有用的性能是查看内存的能力。你能够获取堆快照并配置内存应用状况,以理解内存的调配形式以及可能的形式及内存透露的状况。
应用受反对的 IDE
许多古代 IDE 岂但可能以某种形式启动程序,而且还反对调试 Node 程序。除了具备 Chrome DevTools 中的许多性能外,它们还具备本人的性能,例如能够创立日志点并容许你创立多个调试配置文件。能够通过查阅无关查看器客户端的 Node.js 指南来获取无关这些 IDE 的更多信息。
应用 NDB
另一种抉择是装置 ndb,它是 Node.js 的独立调试器,和浏览器中的 DevTools 相似,就像一个隔离的本地调试器一样。它还有一些在 DevTools 中不可用的额定性能。它反对本地编辑,这意味着你能够批改代码并失去调试器平台间接反对的更新逻辑。这对于进行疾速迭代十分有用。w
预先调试
假如你的程序因为灾难性谬误(例如内存拜访谬误)而解体。这些可能很少见,但的确会产生,特地是如果你的应用程序依赖于本机代码。
要考察这类问题,能够应用 llnode。当程序解体时,llnode
能够通过将 JavaScript 堆栈框架和对象映射到 C/C++ 端的对象来查看它们。为了应用它,你首先须要程序的外围转储。为此你须要应用 process.abort
而不是 process.exit
来敞开代码中的过程。当你应用 process.abort
时,Node 过程在退出时会生成一个外围转储文件。
为了更好地了解 llnode
能够提供的性能,这个视频演示了其一些性能。
有用的 Node 模块
除了上述所有以外,还倡议用第三方软件包做进一步调试。
debug
第一个被简略地称为 debug。应用 debug,你能够基于函数名或整个模块为日志音讯调配特定的命名空间。而后能够通过特定的环境变量抉择将哪些音讯打印到控制台。
例如,这是一个 Node.js 服务器,它正在记录来自整个程序和中间件栈的几条音讯,例如 sequelize
,express:application
和 express:router
:
如果咱们将 DEBUG 环境变量设置为 express:router
并启动雷同的程序,则仅显示标记为 express:router
的音讯:
通过以这种形式过滤音讯,能够深入研究程序单个局部的行为形式,而无需大幅度更改代码的日志记录。
trace 与 clarify
trace 和 clarify 两个模块最好在一起配合应用。
trace
通过提供无关被调用的异步办法的更多详细信息来扩大你的异步栈跟踪,这是 Node.js 默认不提供的路线图。clarify
通过从特定于 Node.js 外部的栈跟踪中删除所有信息来提供帮忙。这使你能够专一于仅针对程序的函数调用。
这些模块都不倡议在生产环境中运行!仅在本地开发环境中进行调试时才应启用它们。
本文首发微信公众号:前端先锋
欢送扫描二维码关注公众号,每天都给你推送陈腐的前端技术文章
欢送持续浏览本专栏其它高赞文章:
- 深刻了解 Shadow DOM v1
- 一步步教你用 WebVR 实现虚拟现实游戏
- 13 个帮你进步开发效率的古代 CSS 框架
- 疾速上手 BootstrapVue
- JavaScript 引擎是如何工作的?从调用栈到 Promise 你须要晓得的所有
- WebSocket 实战:在 Node 和 React 之间进行实时通信
- 对于 Git 的 20 个面试题
- 深刻解析 Node.js 的 console.log
- Node.js 到底是什么?
- 30 分钟用 Node.js 构建一个 API 服务器
- Javascript 的对象拷贝
- 程序员 30 岁前月薪达不到 30K,该何去何从
- 14 个最好的 JavaScript 数据可视化库
- 8 个给前端的顶级 VS Code 扩大插件
- Node.js 多线程齐全指南
- 把 HTML 转成 PDF 的 4 个计划及实现
- 更多文章 …