在Node.js中怎么快速了解出錯(cuò)的問(wèn)題

本篇內(nèi)容介紹了“在Node.js中怎么快速了解出錯(cuò)的問(wèn)題”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

創(chuàng)新互聯(lián)網(wǎng)站建設(shè)由有經(jīng)驗(yàn)的網(wǎng)站設(shè)計(jì)師、開發(fā)人員和項(xiàng)目經(jīng)理組成的專業(yè)建站團(tuán)隊(duì),負(fù)責(zé)網(wǎng)站視覺(jué)設(shè)計(jì)、用戶體驗(yàn)優(yōu)化、交互設(shè)計(jì)和前端開發(fā)等方面的工作,以確保網(wǎng)站外觀精美、網(wǎng)站建設(shè)、做網(wǎng)站易于使用并且具有良好的響應(yīng)性。

Diagnostic report 是 Node.js v14.x 提供的一個(gè)穩(wěn)定功能,在某些情況下會(huì)生成一個(gè) JSON  格式的診斷報(bào)告,可用于開發(fā)、測(cè)試、生產(chǎn)環(huán)境。報(bào)告會(huì)提供有價(jià)值的信息,包括:JavaScript  和本機(jī)堆棧信息、堆統(tǒng)計(jì)信息、平臺(tái)信息、資源使用情況等,幫助用戶快速追蹤問(wèn)題。

生成診斷報(bào)告

提供了多種觸發(fā)診斷報(bào)告的時(shí)機(jī),包括:API 調(diào)用的方式觸發(fā)、針對(duì)未捕獲的異常觸發(fā)、用戶信號(hào)觸發(fā)、致命錯(cuò)誤導(dǎo)致應(yīng)用程序終止觸發(fā)。

API 觸發(fā)

調(diào)用 writeReport() 方法,會(huì)立即生成一份診斷報(bào)告,該方法可以寫在僅當(dāng)你需要診斷報(bào)告時(shí)調(diào)用,以獲取所需的信息。

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

報(bào)告默認(rèn)目錄:Node.js 進(jìn)程當(dāng)前工作目錄報(bào)告默認(rèn)名稱:YYYYMMDD.HHMMSS.PID.SEQUENCE.txt

未捕獲錯(cuò)誤觸發(fā)

當(dāng)程序遇到未捕獲錯(cuò)誤時(shí)主動(dòng)觸發(fā),需要在啟動(dòng)服務(wù)時(shí)加上 --report-uncaught-exception 標(biāo)志,例如:node  --report-uncaught-exception app.js

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

信號(hào)觸發(fā)

正在運(yùn)行的 Node.js 進(jìn)程在接收到特定的信號(hào)后生成診斷報(bào)告,默認(rèn)的信號(hào)為 -SIGUSR2,同樣在啟動(dòng)服務(wù)時(shí)加上  --report-on-signal 標(biāo)志。

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

啟動(dòng)服務(wù) node --report-on-signal app.js 之后觸發(fā)信號(hào) kill -SIGUSR2 55800 會(huì)看到如下信息:

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

基于信號(hào)的報(bào)告生成,目前 Windows 系統(tǒng)是不支持的。通常無(wú)需修改觸發(fā)報(bào)告的信號(hào),如果 -SIGUSR2 信號(hào)已用途其它用途,可通過(guò)  --report-signal 標(biāo)志修改,例如在啟動(dòng)服務(wù)時(shí)這樣執(zhí)行:node --report-on-signal --report-signal  SIGPIPE app.js

致命錯(cuò)誤導(dǎo)致應(yīng)用程序終止觸發(fā)

在啟動(dòng)服務(wù)時(shí)上 --report-on-fatalerror 標(biāo)志,當(dāng)程序發(fā)生一些致命錯(cuò)誤,例如內(nèi)存泄漏、Node.js  運(yùn)行時(shí)的內(nèi)部錯(cuò)誤等也會(huì)觸發(fā)生成診斷報(bào)告。以下是一個(gè)觸發(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)計(jì)時(shí)器(timer)句柄信息

以下代碼就是每 10 秒中程序執(zhí)行一次,你可以通過(guò)上面講的信號(hào)的方式在啟動(dòng)之后獲取診斷報(bào)告。

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

診斷報(bào)告會(huì)有很多信息,我們要看 timer 的信息,定時(shí)器屬于事件循環(huán)的階段之一,所以定位到 libuv 這個(gè)數(shù)組里,以下報(bào)告則展示其句柄信息  is_active 就是活動(dòng)的,firesInMsFromNow 是該計(jì)時(shí)器的觸發(fā)還需要多長(zhǎng)時(shí)間,當(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ā)的一款工具,用于簡(jiǎn)化 Node.js  的診斷報(bào)告的使用,使用它在某些情況下可幫助我們快速定位問(wèn)題。首先全局安裝它,如下命令,之后會(huì)生成一個(gè)全局的可執(zhí)行命令 rtk

npm install report-toolkit --global

inspect 命令

inspect 命令用于自動(dòng)發(fā)現(xiàn) Node.js 診斷報(bào)告中的潛在問(wèn)題,如果檢測(cè)出問(wèn)題會(huì)輸出一條信息,可能是警告。

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 后過(guò)一小會(huì)報(bào) avaScript heap out of memory  錯(cuò)誤同時(shí)會(huì)生成一份診斷報(bào)告,下面是我們使用 rtk 診斷工具檢測(cè)得到如下結(jié)果:

在Node.js中怎么快速了解出錯(cuò)的問(wèn)題

diff 命令diff 命令正如它的名字一樣,是用來(lái)比較多個(gè)報(bào)告之間的不同。

在Node.js中怎么快速了解出錯(cuò)的問(wèn)題

關(guān)于診斷報(bào)告工具 report-toolkit 的更多使用指南參考 report-toolkit Quick Start。

“在Node.js中怎么快速了解出錯(cuò)的問(wèn)題”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

文章名稱:在Node.js中怎么快速了解出錯(cuò)的問(wèn)題
當(dāng)前路徑:http://bm7419.com/article18/pciogp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護(hù)、網(wǎng)站制作、品牌網(wǎng)站設(shè)計(jì)微信小程序、建站公司、Google

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)