方便快捷的调试 Node.js 程序

疯狂的技术宅 前端先锋

在调试程序时总是会遇到各种挑战。Node.js 的异步工作流为这一艰巨的过程增加了额外的复杂性。尽管 V8 引擎为了方便访问异步栈跟踪进行了一些更新,但是在很多数情况下,我们只会在程序主线程上遇到错误,这使得调试有些困难。同样,当我们的 Node.js 程序崩溃时,通常需要依靠一些复杂的 CLI 工具来分析核心转储[1]。

在本文中,我们将介绍一些调试 Node.js 程序的简便方法。

日志记录


当然,没有哪一个开发工具箱是不提供日志的。我们倾向于在本地开发中的整个代码中放置 console.log 语句,但这并不是生产中真正可扩展的策略。你可能需要进行一些过滤和清理,或者实施一致的日志记录策略,以便从中识别出重要的信息。

要实施适当的面向日志的调试策略,可以用 Pino[2]或 Winston[3] 之类的日志记录工具。这些将允许你设置日志级别(INFO、 WARN、ERROR),它们允许你在本地打印详细的日志消息,同时在生产环境下仅打印严重的日志消息。你还可以将这些日志流式传输到聚合器或其他地方,例如 LogStash,Papertrail 甚至 Slack。

使用 Node Inspect 和 Chrome DevTools


日志记录只能使我们了解程序为何无法按预期运行。对于复杂的调试,我们将希望使用断点来检查代码在执行时的行为。

为此,可以使用 Node Inspect。Node Inspect 是 Node.js 附带的调试工具。它实际上只是程序的 Chrome DevTools[4] 的实现,可让你添加断点、控制分步执行、查看变量、并遵循调用堆栈。

有两种方法启动 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

许多现代 IDE 不但能够以某种方式启动程序,而且还支持调试 Node 程序。除了具有 Chrome DevTools 中的许多功能外,它们还具有自己的功能,例如可以创建日志点[7]并允许你创建多个调试配置文件。可以通过查阅有关检查器客户端的 Node.js 指南[8]来获取有关这些 IDE 的更多信息。

</>使用NDB

NDB
另一种选择是安装 ndb[9],它是 Node.js 的独立调试器,和浏览器中的 DevTools 类似,就像一个隔离的本地调试器一样。它还有一些在 DevTools 中不可用的额外功能。它支持本地编辑,这意味着你可以修改代码并得到调试器平台直接支持的更新逻辑。这对于进行快速迭代非常有用。w

事后调试


假设你的程序由于灾难性错误(例如内存访问错误)而崩溃。这些可能很少见,但确实会发生,特别是如果你的应用程序依赖于本机代码。

要调查这类问题,可以使用 llnode[10]。当程序崩溃时,llnode 可以通过将 JavaScript 堆栈框架和对象映射到 C/C 端的对象来检查它们。为了使用它,你首先需要程序的核心转储。为此你需要使用 process.abort 而不是process.exit 来关闭代码中的进程。当你使用 process.abort 时,Node 进程在退出时会生成一个核心转储文件。

为了更好地理解 llnode 可以提供的功能,这个视频演示了其一些功能[11]。

有用的 Node 模块


除了上述所有以外,还建议用第三方软件包做进一步调试。

</>debug

第一个被简单地称为 debug[12]。使用 debug,你可以基于函数名或整个模块为日志消息分配特定的命名空间。然后可以通过特定的环境变量选择将哪些消息打印到控制台。

例如,这是一个 Node.js 服务器,它正在记录来自整个程序和中间件栈的几条消息,例如 sequelize,express:application 和 express:router:

Debug 模块完整输出
如果我们将 DEBUG 环境变量设置为 express:router 并启动相同的程序,则仅显示标记为 express:router 的消息:

Debug 模块过滤后的输出
通过以这种方式过滤消息,可以深入研究程序单个部分的行为方式,而无需大幅度更改代码的日志记录。

t</>race 与 clarify

trace[13] 和 clarify[14] 两个模块最好在一起配合使用。

trace 通过提供有关被调用的异步方法的更多详细信息来扩展你的异步栈跟踪,这是 Node.js 默认不提供的路线图。clarify 通过从特定于 Node.js 内部的栈跟踪中删除所有信息来提供帮助。这使你可以专注于仅针对程序的函数调用。

这些模块都不建议在生产环境中运行!仅在本地开发环境中进行调试时才应启用它们。

来源:https://www.icode9.com/content-1-838051.html

(0)

相关推荐

  • 史诗级更新,VSCODE 可无缝调试浏览器了!

    2021-07-16 微软发布了一篇博客专门介绍了这个功能,VSCODE 牛逼! 在此之前,你想要在 vscode 内调试 chrome 或者 edge 需要借助于 Chrome Debugger 或 ...

  • 使用 VS Code 调试 Node.js 的超简单方法

    前端技术优选 以下文章来源于掘金开发者社区 ,作者iceytea 掘金开发者社区掘金,一个帮助开发者成长的技术社区 原文地址:The Absolute Easiest Way to Debug Nod ...

  • Appium+python自动化14-查看webview上元素(DevTools)

    前言 app上webview的页面实际上是启用的chrome浏览器的内核加载的,如何把手机的网页加载到电脑上,电脑的chrome浏览器上有个开发模式,是可以方便调试的. 一.环境准备 1.手机上装一个 ...

  • Node.js 深度调试指南

    在 Node.js 项目开发过程中,随着项目的发展,调用关系越来越复杂,调试工具的重要性日益凸显. Node(v6.3+)集成了方便好用 V8 Inspect 调试器,允许我们通过 Chrome De ...

  • 写 Node.js 代码,从学会调试开始

    张挺 前端试炼 1周前 在纷繁复杂的代码世界中,出错是难免的,也许在传统的前端代码中,你习惯于 console 来排查问题,这是不合理的,在现代的社会下,调试代码是你最快找到问题的方法. 这篇文章就是 ...

  • 教你nodejs爬虫制作知乎专栏RSS抓取程序

    现在这个社会是信息爆炸的社会,各个网站.app上铺天盖地的都是各种新闻和信息. 为了获取信息,我们每天都要进行各种麻烦的操作,打开各种网站或者手机app,操作显得低效,后来发现了一个神器,那就是RSS ...

  • 推荐一个神器!可以在浏览器运行 Node.js

    全栈修仙之路 5天前 以下文章来源于code秘密花园 ,作者ConardLi 在最新的 Google I/O 主题演讲中 stackblitz 向大家介绍了他们与 Next.js 和 Google 团 ...

  • 快上车!使用 Node.js 搭建一个 API 网关

    编程微刊 1周前 以下文章来源于程序员成长指北 ,作者koala 程序员成长指北专注 Node.js 技术栈分享,从 前端 到 Node.js 再到 后端数据库,祝您成为优秀的高级 Node.js 全 ...

  • 简析 Node.js 特点与应用场景(让你更了解它)

    前端技术优选 今天 以下文章来源于程序员成长指北 ,作者koala 如果你有一定的前端基础,比如 HTML.CSS.JavaScript.jQuery:那么,Node.js 能让你以最低的成本快速过渡 ...

  • JavaScript 事件循环:从起源到浏览器再到 Node.js

    冰森 前端技术优选 今天 很多文章都在讨论事件循环 (Event Loop) 是什么,而几乎没有人讨论为什么 JavaScript 中会有事件循环.博主认为这是为什么很多人都不能很好理解事件循环的一个 ...

  • 看了就会的 Node.js 三大基础模块常用 API

    技术漫谈 4月11日 以下文章来源于前端试炼 ,作者小炼

  • 字节跳动最爱考的前端面试题:Node.js 基础

    前端技术优选 今天 前几天,跟我一朋友聊天,他现在是阿里的架构师,说:「他们根本不知道,现在的电商大促有多么依赖 Node.js.」 说真的,我倒并不意外.作为一个定位明确的高性能 Web 服务器,N ...

  • 成为自信的node.js开发者(一)

    原创 雾豹 前端技术优选 今天 作者:雾豹 原文地址:https://juejin.im/post/5c6a780451882561dd7b65d6 适合阅读的同学 想更进一步深入理解node的同学, ...