任何信息的價值都有時效性和適用性,本文寫時 Node.js 的最新發行版是
v11.14.0
,LTS
是v10.15.3
,文中出現的源碼均來自tag
:v11.14.0
。使用的電腦環境是:macOs 10.14.2。javascript
Node.js is a JavaScript runtime built on Chrome's V8 JavaScript engine.html
Node.js 是基於 V8 和 libuv 進行構建的,底層是以 C/C++
實現,而標準庫部分則是採用 JS
編寫。因此 Node.js 的源碼調試分爲兩部分,C/C++
代碼調試和 JS
代碼調試。更多...java
C/C++
、JS
的 調試器/IDE
。發行版本的 Node
是不支持調試的,因此咱們須要本身經過源碼構建一份可調試的 Node
,Node
項目構建經過 make
進行管理,開發者們貼心的準備好了 configure
文件,因此構建一個本身定製版的 Node
很是方便。node
官方構建指南c++
首先,進入到下載下來的 Node.js 源碼倉庫目錄(以後的操做都在這個目錄進行)。git
修改 JS
源碼入口文件(./lib/internal/bootstrap/node.js
)文件中的內容,在頭部加入 debugger
。github
'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
就能夠生成可調試的編譯配置項,而後再進行編譯。json
完整的命令以下:bootstrap
#!/bin/bash
./configure --debug
make -C out BUILDTYPE=Debug -j4
echo "showtime 🎉"
複製代碼
由於此後咱們每次修改文件都須要從新編譯,因此我這裏把這些命令寫到了 build.sh
裏,以後的修改須要從新編譯時,執行一次這個文件就能夠了。bash
執行這個文件以前,須要先給這個文件一個可執行的權限:
chmod +x build.sh
複製代碼
完事具有,只須要在命令行輸入 ./build.sh
就能夠開始編譯了,而後你就能夠去衝杯☕️了(coffee or tea? tea, pls)。 編譯以後的文件你能夠在 ./out/Debug/
目錄下找到,裏面的 Node
文件就是咱們所須要的了。
建立一個用於調試的項目/文件,裏面隨便寫上一些什麼,固然,你也能夠用現成已經有的項目/文件。 爲了方便,我就在 Node.js
的源碼倉庫目錄下面建立了一個test.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 的更多調試姿式請看這裏
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_main.cc
打上 debugger 標識。 回到設置界面選擇剛剛配置的 "Attact Program",而後點擊綠色的三角標開始,而後你就能夠進入到 Node.js
源碼中 C/C++
部分的調試了。