Node.js應用的可視化調試與性能分析
在 Node.js v6.3 之前的版本,調試程序使用的是舊的 V8 Debugger Protocol,可以通過 node --debug app.js 來進行。而為了能在圖形界面下進行可視化斷點調試,需要借助 VSCode、WebStorm 之類的編輯器和插件,或者安裝額外的工具,比如 node-inspector 。
對于大多數的前端開發者來講,對 Chrome 瀏覽器自帶的 DevTools 并不陌生。新版本的 Node.js 開始支持新的 Chrome DevTools Protocol,通過 node --inspect app.js 即可啟動新版本的調試協議,借助 Chrome DevTools 即可達到與以往調試 Web 頁面一樣的使用體驗。
一些編輯器也開始支持新的 Node.js 調試協議,或者通過安裝 Chrome 插件 NIM 來支持。但是如果你電腦上已安裝了 Node.js 6.3+ 和 Chrome 55+,那么不再需要任何額外的工具即可輕輕松松調試你的 Node.js 程序了。
斷點調試
首先讓我們新建一個程序文件 app.js 以便體驗新的調試方式:
- const http = require('http');
- const server = http.createServer(function (req, res) {
- res.writeHead(200, { 'content-type': 'text/html' });
- res.end('<h1>It works!</h1>');
- });
- server.listen(3000, function () {
- console.log('Listening on http://localhost:3000');
- });
然后執行以下命令啟動程序并進入調試模式:
- node --inspect app.js
可以看到控制臺打印出以下信息:
- Debugger listening on ws://127.0.0.1:9229/1bde07a4-2afa-44b1-a3bc-45aa9977ff67
- For help see https://nodejs.org/en/docs/inspector
- Listening on http://localhost:3000
此時,打開 Chrome 瀏覽器(需要 Chrome 55 或更高版本),在地址欄中輸入 chrome://inspect 并按回車,會打開如下界面:
點擊界面上的 Open dedicated DevTools for Node 鏈接即可打開調試窗口:
在該窗口中點擊 Sources 標簽,并在左側邊欄的 file:// 下找到我們編寫的源碼文件 app.js 即可看到其源碼。如果要進行斷點調試,只需要在源碼的行號上點一下即可:
在窗口的右側邊欄,可以看到 Watch(監視) 、 Call Stack(調用堆棧) 、 Scope(作用域) 等信息。你也可以直接在源碼窗口修改里面的代碼,并按 ⌘ + S (Windows 系統是 Ctrl + S )保存即可立即生效。
性能分析
通過調試界面的 Profiler 標簽可以分析哪些 Node.js 程序的 CPU 占用比較高:
我們可以借助 wrk 命令進行簡單的 HTTP 接口測試。首先點擊界面中的 Start 按鈕開始記錄 CPU 占用信息,然后在命令行窗口執行以下命令(啟動 5 個線程,100 個并發連接,持續 1 分鐘):
- wrk -c 100 -t 5 -d 1m http://localhost:3000/
等待 1 分鐘,命令執行完畢后,在 DevTools 界面點擊 Stop 按鈕,即可看到如下的結果:
另外還可以通過 Memory 標簽來進行內存占用相關的分析。
調試 TypeScript 程序
如果你的程序是使用 TypeScript 編寫的,可以借助 ts-node 來啟動調試模式:
- ts-node --inspect app.ts
或者:
- node --inspect --require ts-node/register app.ts
調試正在運行的 Node.js 進程
如果程序啟動的時候沒有加上 --inspect 選項,為了讓它進入調試模式,可以給該進程發送 SIGUSR1 信號來調試(92801 是被調試 Node.js 進程的 PID,根據實際情況替換):
- kill -s SIGUSR1 92801
可以看到該進程控制臺會打印出以下提示:
- Debugger listening on ws://127.0.0.1:9229/cc35d4da-c8ae-42e3-943a-8ac81d5c067a
- For help see https://nodejs.org/en/docs/inspector
此時按照上文的方法使用 Chrome DevTools 調試即可。


































