iT邦幫忙

2024 iThome 鐵人賽

DAY 11
1

nestjs 中斷點設置 with vscode

目標

  1. 回顧 nestjs 分層架構流程
  2. 介紹如何透過 vscode 來配置逐步執行的功能

概念

nestjs 透過分層架構讓職責切分到多個不同的元件上,當要查找問題時就可以針對該負責的元件做修改。了解整個請求的生命周期,才能比較具有方向性去除錯,不會如同大海撈針。而其整個生命周期如下圖:

當成是遇到非預期的結果時,開發者希望從程式上的邏輯去檢測實際執行的當下狀況時,直覺上會想要加入 log。往往需要耗費眼力去觀察結果是否有除錯用的旗號,甚至是發現加入的旗號不會出現在執行點上。

最省時且直接的方式是,如果能在要執行的程式下中斷點,讓程式執行能夠逐步照開發者關注的中斷點去檢查執行狀態。 vscode 這個整合開發編輯器提供了一個 launch.json 的方式,可以讓程式以除錯的模式逐步執行。

設定 launch.json

以下是使用 pnpm 作為 nodejs 的 pacakge manager 的範例。建立一個 launch.json 在 .vscode 資料夾下:

{
	"version": "2.0.0",
	"configurations": [
		{
			"type": "node",
			"request": "launch",
			"name": "Debug Nest Framework",
			"runtimeExecutable": "pnpm", // 此處可以替換為該專案使用的 node module 管理套件工具
			"runtimeArgs": [
				"run",
				"start:debug",
				"--",
				"--inspect-brk"
			],
			"autoAttachChildProcesses": true,
			"restart": true,
			"sourceMaps": true,
			"stopOnEntry": false,
			"console": "integratedTerminal",
		}
	]
}

然後就可以下中斷點,接著使用除錯模式啟動,然後就可以逐步執行驗證流程。如下圖:

找錯誤的概念

雖然已經有了中斷點,但還是有可能會遇到。除錯模式走不到中斷的狀況。因為有可能當初的設計造成根本無法走如預期的中斷點。

所以,除錯前應該有幾件事情要做:

  1. 蒐集當下錯誤拿到的關鍵資訊
    發生的時間點與當下的狀態以及 error stack 或是跟據 context id 過慮出來的 error log 。
  2. 回顧當初自己對系統的設計。
    執行的邏輯設計息息相關,所以如果沒有了解設計去除錯,真的就是盲人模象,很容易找錯方向。
  3. 把設計當藍圖,檢視可能出錯的部份去下中斷點。
    有了設計當藍圖,就可以大致上在搜索問題有個範圍。但還是機會可能找不到。因為可能線上的執行環境資源與當下執行環境資源不同。代表問題是屬於線上問題,就必須靠一些 log 上的關聯找出相對應時間的機器與資源狀態。從 log 查錯還是會不容易, opentelemetry 對此提出一些標準,希望透過對一些 log 資料標記與彙整,有機會找到每個時間的事件的關聯性。因為更進階的作法,還是必須要每個服務依照 opentelemtry 標準做格式化 log ,然後使用相對應的蒐集彙整 log 服務與儀表板服務來做視覺化儀表板。

這樣找起錯誤,會相對範圍比較小,讓除錯的效率提升。

結論

vscode 提供的這個中斷點工具,能夠讓開發者在開發階段,就可以確認程式邏輯的執行流程。中斷點相對於埋 log 去找方便的多。但是如果在線上系統找錯誤,需要在適當的地方做對應的 error log 處理。因為線上系統是儘量不要且不應該因為除錯重新佈署。

埋 log 的要點,可以透過一些 log 程式設定不同的 log level,來幫來查詢錯誤時,可以方便過濾掉一些不重要的資訊。且 log 必須要是重點式下,不應該放過多,不具識別性的 log 造成混淆。

bug


上一篇
nestjs 分層架構 Interceptor
下一篇
nestjs 測試概念
系列文
透過 nestjs 框架,讓 nodejs 系統維護度增加31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言