任何資訊的價值都有時效性和適用性,本文寫時 Node.js 的最新發行版是
v11.14.0
,LTS
是v10.15.3
,文中出現的原始碼均來自tag
:v11.14.0
。使用的電腦環境是:macOs 10.14.2。
前言
Node.js is a JavaScript runtime built on Chrome's V8 JavaScript engine.
Node.js 是基於 V8 和 libuv 進行構建的,底層是以 C/C++
實現,而標準庫部分則是採用 JS
編寫。所以 Node.js 的原始碼除錯分為兩部分,C/C++
程式碼除錯和 JS
程式碼除錯。更多...
準備工作
- Node.js 原始碼一份
- Visual Studio Code 或其它除錯
C/C++
、JS
的偵錯程式/IDE
。
開始除錯
編譯
發行版本的 Node
是不支援除錯的,所以我們需要自己通過原始碼構建一份可除錯的 Node
,Node
專案構建通過 make
進行管理,開發者們貼心的準備好了 configure
檔案,所以構建一個自己定製版的 Node
非常方便。
第一步:入口檔案新增 debugger
首先,進入到下載下來的 Node.js 原始碼倉庫目錄(之後的操作都在這個目錄進行)。
修改 JS
原始碼入口檔案(./lib/internal/bootstrap/node.js
)檔案中的內容,在頭部加入 debugger
。
'use strict';
debugger; // <<--- 在這裡加入 debugger;
// This file is compiled as if it's wrapped in a function with arguments
// passed by node::RunBootstrapping()
/* global process, require, internalBinding, isMainThread, ownsProcessState */
/* global primordials */
const { Object, Symbol } = primordials;
const config = internalBinding('config');
const { deprecate } = require('internal/util');
setupProcessObject();
setupGlobalProxy();
setupBuffer();
複製程式碼
第二步:執行編譯
Node.js 使用 make 管理專案,開發者們準備了 configure 檔案,我們只需要執行 ./configure
就可生成當前環境可用的編譯預設配置,然後執行 make 進行編譯。但是預設的編譯配置是沒有啟用除錯模式的,因此,我們需要在執行 ./configure
時加上 --debug
就可以生成可除錯的編譯配置項,然後再進行編譯。
完整的命令如下:
#!/bin/bash
./configure --debug
make -C out BUILDTYPE=Debug -j4
echo "showtime ?"
複製程式碼
因為此後我們每次修改檔案都需要重新編譯,所以我這裡把這些命令寫到了 build.sh
裡,之後的修改需要重新編譯時,執行一次這個檔案就可以了。
執行這個檔案之前,需要先給這個檔案一個可執行的許可權:
chmod +x build.sh
複製程式碼
完事具備,只需要在命令列輸入 ./build.sh
就可以開始編譯了,然後你就可以去衝杯☕️了(coffee or tea? tea, pls)。
編譯之後的檔案你可以在 ./out/Debug/
目錄下找到,裡面的 Node
檔案就是我們所需要的了。
除錯 JS 原始碼
第一步:準備一份測試檔案
建立一個用於除錯的專案/檔案,裡面隨便寫上一些什麼,當然,你也可以用現成已經有的專案/檔案。
為了方便,我就在 Node.js
的原始碼倉庫目錄下面建立了一個檔案:
console.log('hello world');
複製程式碼
第二步:啟動服務
現在讓我們用編譯出來的 Node
執行這個檔案:
./out/Debug/Node --inspect-brk=9229 test.js
複製程式碼
看到如下提示就說明你的服務已經啟用並處於可除錯狀態:
Debugger listening on ws://127.0.0.1:9229/0aeaa4ec-113b-4e08-94d9-0477c61d59ac
For help, see: https://nodejs.org/en/docs/inspector
複製程式碼
第三步:除錯
接下來我們完成另外一半,用安裝好的 Visual Studio Code
開啟你的專案
點選左側的蜘蛛標誌,進入除錯配置介面,然後點選右上角的配置按鈕(開啟目錄下的 .vscode/launch.json
)
注意:Visual Studio Code 需要開啟一個專案時才能夠建立配置檔案
在配置檔案中填入如下內容:
{
// 使用 IntelliSense 瞭解相關屬性。
// 懸停以檢視現有屬性的描述。
// 欲瞭解更多資訊,請訪問: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "attach",
"name": "Attact Program",
"port": 9229
}
]
}
複製程式碼
切記,記得進行儲存。回到設定介面選擇剛剛配置的 "Attact Program",然後點選綠色的三角標開始,然後你就可以進入到 Node.js
原始碼中 JS
部分的除錯了。
之後每次改動你的程式碼的時候都記得執行以下 build.sh
重新執行編譯。
關於 vscode 中 JS 的更多除錯姿勢請看這裡
除錯 C/C++ 原始碼
安裝外掛
Visual Studio Code 預設是不支援 C/C++
除錯的,需要安裝對應的外掛,開啟 Visual Studio Code 的外掛商店,
搜尋 c++
,安裝名為 C/C++
的官方外掛
除錯
同 JS 部分一樣,開啟安裝好的 Visual Studio Code
開啟你的專案
點選左側的蜘蛛標誌,進入除錯配置介面,然後點選右上角的配置按鈕(開啟目錄下的 .vscode/launch.json
)
注意:Visual Studio Code 需要開啟一個目錄才能夠建立配置檔案
在配置檔案中填入如下內容:
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(lldb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/out/Debug/Node",
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": true,
"MIMode": "lldb"
}
]
}
複製程式碼
切記,記得進行儲存。
然後用 IDE 在 C/C++
入口檔案處 ./src/node_mian.cc
打上 debugger 標識。
回到設定介面選擇剛剛配置的 "Attact Program",然後點選綠色的三角標開始,然後你就可以進入到 Node.js
原始碼中 C/C++
部分的除錯了。