网易首页 > 网易号 > 正文 申请入驻

在 Node.js 中使用诊断报告快速追踪问题

0
分享至

作者:五月君 来源:Nodejs技术栈

Diagnostic report 是 Node.js v14.x 提供的一个稳定功能,在某些情况下会生成一个 JSON 格式的诊断报告,可用于开发、测试、生产环境。报告会提供有价值的信息,包括:JavaScript 和本机堆栈信息、堆统计信息、平台信息、资源使用情况等,帮助用户快速追踪问题。

生成诊断报告

提供了多种触发诊断报告的时机,包括:API 调用的方式触发、针对未捕获的异常触发、用户信号触发、致命错误导致应用程序终止触发。

API 触发

调用 writeReport() 方法,会立即生成一份诊断报告,该方法可以写在仅当你需要诊断报告时调用,以获取所需的信息。

const process = require('process');
process.report.writeReport();

报告默认目录:Node.js 进程当前工作目录报告默认名称:YYYYMMDD.HHMMSS.PID.SEQUENCE.txt

未捕获错误触发

当程序遇到未捕获错误时主动触发,需要在启动服务时加上 --report-uncaught-exception 标志,例如:node --report-uncaught-exception app.js

// app.js
throw new Error('testerror')

信号触发

正在运行的 Node.js 进程在接收到特定的信号后生成诊断报告,默认的信号为 -SIGUSR2,同样在启动服务时加上 --report-on-signal 标志。

// app.js
console.log(`process id: ${process.pid}`)
setInterval(() => {}, 1000);

启动服务 node --report-on-signal app.js 之后触发信号 kill -SIGUSR2 55800 会看到如下信息:

process id: 3512
Writing Node.js report to file: report.20210113.211250.3512.0.001.json
Node.js report completed

基于信号的报告生成,目前 Windows 系统是不支持的。通常无需修改触发报告的信号,如果 -SIGUSR2 信号已用途其它用途,可通过 --report-signal 标志修改,例如在启动服务时这样执行:node --report-on-signal --report-signal SIGPIPE app.js

致命错误导致应用程序终止触发

在启动服务时上 --report-on-fatalerror 标志,当程序发生一些致命错误,例如内存泄漏、Node.js 运行时的内部错误等也会触发生成诊断报告。以下是一个触发内存泄漏的例子:

const format = bytes => (bytes / 1024 / 1024).toFixed(2) + ' MB';
const print = () => {
const memoryUsage = process.memoryUsage();
console.log(`heapTotal: ${format(memoryUsage.heapTotal)}, heapUsed: ${format(memoryUsage.heapUsed)}`);
}
const total = [];
setInterval(() => {
total.push(new Array(20, 1024, 1024));
print();
}, 1000)

用例分析

事件循环计时器(timer)句柄信息

以下代码就是每 10 秒程序执行一次,你可以通过上面讲的信号的方式在启动之后获取诊断报告。

console.log(process id: ${process.pid})
setInterval(() => {}, 1000 * 10);

诊断报告会有很多信息,我们要看 timer 的信息,定时器属于事件循环的阶段之一,所以定位到 libuv 这个数组里,以下报告则展示其句柄信息 is_active 就是活动的,firesInMsFromNow 是该计时器的触发还需要多长时间,当前示例大约还要 9 秒多执行。

"libuv": [
{
"type": "timer",
"is_active": true,
"is_referenced": true,
"address": "0x0000000105804100",
"repeat": 0,
"firesInMsFromNow": 9067,
"expired": false
}
]

参考:Easily identify problems in Node.js applications with Diagnostic Report

诊断工具(report-toolkit)

report-toolkit 是 IBM 开发的一款工具,用于简化 Node.js 的诊断报告的使用,使用它在某些情况下可帮助我们快速定位问题。首先全局安装它,如下命令,之后会生成一个全局的可执行命令 rtk

npm install report-toolkit --global

inspect 命令

inspect 命令用于自动发现 Node.js 诊断报告中的潜在问题,如果检测出问题会输出一条信息,可能是警告。

const format = function (bytes) {
return (bytes / 1024 / 1024).toFixed(2) + ' MB';
};
const print = function() {
const memoryUsage = process.memoryUsage();
console.log(`heapTotal: ${format(memoryUsage.heapTotal)}, heapUsed: ${format(memoryUsage.heapUsed)}`);
}
const total = [];
setInterval(function() {
total.push(new Array(20 * 1024 * 1024)); // 大内存占用
print();
}, 1000)

执行 node --report-on-fatalerror test.js 后过一小会报 avaScript heap out of memory 错误同时会生成一份诊断报告,下面是我们使用 rtk 诊断工具检测得到如下结果:

diff 命令diff 命令正如它的名字一样,是用来比较多个报告之间的不同。

Reference

  • Node.js 14 版本:新的诊断工具、功能和性能增强
  • Easily identify problems in Node.js applications with Diagnostic Report
  • Introducing report-toolkit for Node.js Diagnostic Reports
  • Node.js latest v14.x Diagnostic report

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
追觅首谈造车:与小米同期启动,不必烧上千亿

追觅首谈造车:与小米同期启动,不必烧上千亿

虎嗅APP
2026-04-29 22:06:59
一旦中美开战,要先摧毁中国的工业体系?美军中将:中美实力相等

一旦中美开战,要先摧毁中国的工业体系?美军中将:中美实力相等

小正说娱乐
2026-05-01 10:52:31
“夫妻本是同林鸟”,但抱歉,张豆豆这一次救不了孙杨

“夫妻本是同林鸟”,但抱歉,张豆豆这一次救不了孙杨

娱乐圈笔娱君
2026-04-30 16:40:35
董璇独自到北京4s店买车,打扮得跟少女似的!当场下单,豪气十足

董璇独自到北京4s店买车,打扮得跟少女似的!当场下单,豪气十足

小娱乐悠悠
2026-05-01 08:26:14
KD小概率出战未改大局!名宿不满火箭过度备战 帕森斯:伤势很重

KD小概率出战未改大局!名宿不满火箭过度备战 帕森斯:伤势很重

颜小白的篮球梦
2026-05-01 08:18:39
辽宁锦州凌海市发生一起交通事故造成4人死亡

辽宁锦州凌海市发生一起交通事故造成4人死亡

新京报
2026-04-30 13:08:07
网红白冰偷税被追缴1891万,全网账号已禁言,妻子江梦瑶曝其现状

网红白冰偷税被追缴1891万,全网账号已禁言,妻子江梦瑶曝其现状

阿纂看事
2026-04-28 18:04:57
张雪峰的财产争夺战开始了!

张雪峰的财产争夺战开始了!

八卦疯叔
2026-04-29 11:08:54
马英九基金会内部调查进展,李德维给出最新回应,萧旭岑信守承诺

马英九基金会内部调查进展,李德维给出最新回应,萧旭岑信守承诺

探秘未知
2026-05-01 06:36:11
重重抽范明耳光,用羞耻姿势抓撒贝宁丢水里…孙杨口碑骤跌!

重重抽范明耳光,用羞耻姿势抓撒贝宁丢水里…孙杨口碑骤跌!

魔都囡
2026-05-01 08:29:48
阿尔兹海默症最后都是咋去世的?医生叹息:去世前,身体有5征兆

阿尔兹海默症最后都是咋去世的?医生叹息:去世前,身体有5征兆

健康之光
2026-04-30 14:15:08
3年亏100亿、巨头首亏1786亿:全球车企集体"失血",不只中国

3年亏100亿、巨头首亏1786亿:全球车企集体"失血",不只中国

像素与芯片
2026-04-29 17:21:25
给AI发100美元去二手市场捡漏,结果它给自己买了19个乒乓球

给AI发100美元去二手市场捡漏,结果它给自己买了19个乒乓球

DeepTech深科技
2026-04-29 14:22:57
5月金股出炉!这些翻倍股已被提前锁定

5月金股出炉!这些翻倍股已被提前锁定

新浪财经
2026-04-30 21:28:34
大师靠“美国崩溃论”卷走百亿,跑路美国后,痛骂中国人

大师靠“美国崩溃论”卷走百亿,跑路美国后,痛骂中国人

谈史论天地
2026-04-25 11:00:08
首个石油储备完全枯竭国家出现,比菲律宾惨,还有三个国家很危险

首个石油储备完全枯竭国家出现,比菲律宾惨,还有三个国家很危险

混沌录
2026-04-24 21:02:11
欧战积分排名:英超遥遥领先 巴列卡诺赢球助西甲力压德甲排第2

欧战积分排名:英超遥遥领先 巴列卡诺赢球助西甲力压德甲排第2

智道足球
2026-05-01 08:59:42
马斯克,撕破脸了

马斯克,撕破脸了

蓝钻故事
2026-04-30 22:41:52
发现一个奇怪的现象:凡是情绪稳定、睡眠好、不焦虑的人,都有一个共性,那就是再大的事也不搁在心里,再恶劣的环境也能想办法适应

发现一个奇怪的现象:凡是情绪稳定、睡眠好、不焦虑的人,都有一个共性,那就是再大的事也不搁在心里,再恶劣的环境也能想办法适应

LULU生活家
2026-04-24 19:12:24
厄齐尔亲口承认:一句话得罪14亿人,全欧豪门为何集体拉黑他?

厄齐尔亲口承认:一句话得罪14亿人,全欧豪门为何集体拉黑他?

有态度的体育小白
2026-05-01 10:52:39
2026-05-01 12:31:00
Nodejs开发
Nodejs开发
分享只有程序员懂的干货
648文章数 823关注度
往期回顾 全部

科技要闻

苹果上季在华收入继续大增 iPhone收入新高

头条要闻

辽宁舰遭日本侦察机侦察 解放军一句警告让其放弃企图

头条要闻

辽宁舰遭日本侦察机侦察 解放军一句警告让其放弃企图

体育要闻

季后赛场均5.4分,他凭啥在骑士打首发?

娱乐要闻

邓超在景德镇被偶遇,穿黑外套逛茶园

财经要闻

GPU神话松动,AI真正的战场变了

汽车要闻

专访捷途汪如生:捷途双线作战 全球化全面落地

态度原创

亲子
时尚
数码
房产
公开课

亲子要闻

科普|孩子为何白天不咳晚上咳

今年夏天的裙子,长长长长一点更好看!

数码要闻

升级了个寂寞!酷睿Ultra 9 386H跑分曝光:性能战平上代285H

房产要闻

熬了6年,涨了2亿,三亚核心区这块地再次上架

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版