您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“在Node.js中怎么快速了解出錯的問題”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
Diagnostic report 是 Node.js v14.x 提供的一個穩(wěn)定功能,在某些情況下會生成一個 JSON 格式的診斷報告,可用于開發(fā)、測試、生產(chǎn)環(huán)境。報告會提供有價值的信息,包括:JavaScript 和本機堆棧信息、堆統(tǒng)計信息、平臺信息、資源使用情況等,幫助用戶快速追蹤問題。
生成診斷報告
提供了多種觸發(fā)診斷報告的時機,包括:API 調(diào)用的方式觸發(fā)、針對未捕獲的異常觸發(fā)、用戶信號觸發(fā)、致命錯誤導(dǎo)致應(yīng)用程序終止觸發(fā)。
API 觸發(fā)
調(diào)用 writeReport() 方法,會立即生成一份診斷報告,該方法可以寫在僅當(dāng)你需要診斷報告時調(diào)用,以獲取所需的信息。
const process = require('process'); process.report.writeReport();
報告默認(rèn)目錄:Node.js 進(jìn)程當(dāng)前工作目錄報告默認(rèn)名稱:YYYYMMDD.HHMMSS.PID.SEQUENCE.txt
未捕獲錯誤觸發(fā)
當(dāng)程序遇到未捕獲錯誤時主動觸發(fā),需要在啟動服務(wù)時加上 --report-uncaught-exception 標(biāo)志,例如:node --report-uncaught-exception app.js
// app.js throw new Error('testerror')
信號觸發(fā)
正在運行的 Node.js 進(jìn)程在接收到特定的信號后生成診斷報告,默認(rèn)的信號為 -SIGUSR2,同樣在啟動服務(wù)時加上 --report-on-signal 標(biāo)志。
// app.js console.log(`process id: ${process.pid}`) setInterval(() => {}, 1000);
啟動服務(wù) node --report-on-signal app.js 之后觸發(fā)信號 kill -SIGUSR2 55800 會看到如下信息:
process id: 3512 Writing Node.js report to file: report.20210113.211250.3512.0.001.json Node.js report completed
基于信號的報告生成,目前 Windows 系統(tǒng)是不支持的。通常無需修改觸發(fā)報告的信號,如果 -SIGUSR2 信號已用途其它用途,可通過 --report-signal 標(biāo)志修改,例如在啟動服務(wù)時這樣執(zhí)行:node --report-on-signal --report-signal SIGPIPE app.js
致命錯誤導(dǎo)致應(yīng)用程序終止觸發(fā)
在啟動服務(wù)時上 --report-on-fatalerror 標(biāo)志,當(dāng)程序發(fā)生一些致命錯誤,例如內(nèi)存泄漏、Node.js 運行時的內(nèi)部錯誤等也會觸發(fā)生成診斷報告。以下是一個觸發(fā)內(nèi)存泄漏的例子:
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)
用例分析
事件循環(huán)計時器(timer)句柄信息
以下代碼就是每 10 秒中程序執(zhí)行一次,你可以通過上面講的信號的方式在啟動之后獲取診斷報告。
console.log(process id: ${process.pid}) setInterval(() => {}, 1000 * 10);
診斷報告會有很多信息,我們要看 timer 的信息,定時器屬于事件循環(huán)的階段之一,所以定位到 libuv 這個數(shù)組里,以下報告則展示其句柄信息 is_active 就是活動的,firesInMsFromNow 是該計時器的觸發(fā)還需要多長時間,當(dāng)前示例大約還要 9 秒多執(zhí)行。
"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 開發(fā)的一款工具,用于簡化 Node.js 的診斷報告的使用,使用它在某些情況下可幫助我們快速定位問題。首先全局安裝它,如下命令,之后會生成一個全局的可執(zhí)行命令 rtk
npm install report-toolkit --global
inspect 命令
inspect 命令用于自動發(fā)現(xiàn) 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)); // 大內(nèi)存占用 print(); }, 1000)
執(zhí)行 node --report-on-fatalerror test.js 后過一小會報 avaScript heap out of memory 錯誤同時會生成一份診斷報告,下面是我們使用 rtk 診斷工具檢測得到如下結(jié)果:
diff 命令diff 命令正如它的名字一樣,是用來比較多個報告之間的不同。
關(guān)于診斷報告工具 report-toolkit 的更多使用指南參考 report-toolkit Quick Start。
“在Node.js中怎么快速了解出錯的問題”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。