方便快捷的調試 Node.js 程序

方便快捷的調試 Node.js 程序

瘋狂的技術宅 前端先鋒 前端

方便快捷的調試 Node.js 程序
在調試程序時老是會遇到各類挑戰。Node.js 的異步工做流爲這一艱鉅的過程增長了額外的複雜性。儘管 V8 引擎爲了方便訪問異步棧跟蹤進行了一些更新,可是在不少數狀況下,咱們只會在程序主線程上遇到錯誤,這使得調試有些困難。一樣,當咱們的 Node.js 程序崩潰時,一般須要依靠一些複雜的 CLI 工具來分析核心轉儲[1]。node

在本文中,咱們將介紹一些調試 Node.js 程序的簡便方法。chrome

日誌記錄


固然,沒有哪個開發工具箱是不提供日誌的。咱們傾向於在本地開發中的整個代碼中放置 console.log 語句,但這並非生產中真正可擴展的策略。你可能須要進行一些過濾和清理,或者實施一致的日誌記錄策略,以便從中識別出重要的信息。express

要實施適當的面向日誌的調試策略,能夠用 Pino[2]或 Winston[3] 之類的日誌記錄工具。這些將容許你設置日誌級別(INFO、 WARN、ERROR),它們容許你在本地打印詳細的日誌消息,同時在生產環境下僅打印嚴重的日誌消息。你還能夠將這些日誌流式傳輸到聚合器或其餘地方,例如 LogStash,Papertrail 甚至 Slack。瀏覽器

使用 Node Inspect 和 Chrome DevTools


日誌記錄只能使咱們瞭解程序爲什麼沒法按預期運行。對於複雜的調試,咱們將但願使用斷點來檢查代碼在執行時的行爲。服務器

爲此,可使用 Node Inspect。Node Inspect 是 Node.js 附帶的調試工具。它實際上只是程序的 Chrome DevTools[4] 的實現,可以讓你添加斷點、控制分步執行、查看變量、並遵循調用堆棧。app

有兩種方法啓動 Node Inspect,但最簡單的方法可能就是使用 --inspect-brk 標誌來調用 Node.js 應用程序:框架

$ node --inspect-brk $your_script_name

方便快捷的調試 Node.js 程序
Node inspector
啓動程序後,前往 Chrome 瀏覽器中的 chrome://inspect URL 進入 Chrome DevTools。藉助 Chrome DevTools,你能夠擁有在瀏覽器中調試 JavaScript 時的全部功能。最有用的功能是檢查內存的能力[5]。你能夠獲取堆快照[6]並配置內存使用狀況,以瞭解內存的分配方式以及可能的方式及內存泄漏的狀況。異步

</>使用受支持的IDE

許多現代 IDE 不但可以以某種方式啓動程序,並且還支持調試 Node 程序。除了具備 Chrome DevTools 中的許多功能外,它們還具備本身的功能,例如能夠建立日誌點[7]並容許你建立多個調試配置文件。能夠經過查閱有關檢查器客戶端的 Node.js 指南[8]來獲取有關這些 IDE 的更多信息。ide

</>使用NDB

方便快捷的調試 Node.js 程序
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:
方便快捷的調試 Node.js 程序

Debug 模塊完整輸出
若是咱們將 DEBUG 環境變量設置爲 express:router 並啓動相同的程序,則僅顯示標記爲 express:router 的消息:
方便快捷的調試 Node.js 程序

Debug 模塊過濾後的輸出
經過以這種方式過濾消息,能夠深刻研究程序單個部分的行爲方式,而無需大幅度更改代碼的日誌記錄。

t</>race 與 clarify

trace[13] 和 clarify[14] 兩個模塊最好在一塊兒配合使用。

trace 經過提供有關被調用的異步方法的更多詳細信息來擴展你的異步棧跟蹤,這是 Node.js 默認不提供的路線圖。clarify 經過從特定於 Node.js 內部的棧跟蹤中刪除全部信息來提供幫助。這使你能夠專一於僅針對程序的函數調用。

這些模塊都不建議在生產環境中運行!僅在本地開發環境中進行調試時才應啓用它們。

相關文章
相關標籤/搜索