Node.js 調試 源碼

任何信息的價值都有時效性和適用性,本文寫時 Node.js 的最新發行版是 v11.14.0LTSv10.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 是基於 V8libuv 進行構建的,底層是以 C/C++ 實現,而標準庫部分則是採用 JS 編寫。因此 Node.js 的源碼調試分爲兩部分,C/C++ 代碼調試和 JS 代碼調試。更多...java

準備工做

  1. Node.js 源碼一份
  2. Visual Studio Code 或其它調試 C/C++JS調試器/IDE

開始調試

編譯

發行版本的 Node 是不支持調試的,因此咱們須要本身經過源碼構建一份可調試的 NodeNode 項目構建經過 make 進行管理,開發者們貼心的準備好了 configure 文件,因此構建一個本身定製版的 Node 很是方便。node

官方構建指南c++

第一步:入口文件添加 debugger

首先,進入到下載下來的 Node.js 源碼倉庫目錄(以後的操做都在這個目錄進行)。git

修改 JS 源碼入口文件(./lib/internal/bootstrap/node.js)文件中的內容,在頭部加入 debuggergithub

'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 文件就是咱們所須要的了。

調試 JS 源碼

第一步:準備一份測試文件

建立一個用於調試的項目/文件,裏面隨便寫上一些什麼,固然,你也能夠用現成已經有的項目/文件。 爲了方便,我就在 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 的更多調試姿式請看這裏

調試 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_main.cc 打上 debugger 標識。 回到設置界面選擇剛剛配置的 "Attact Program",而後點擊綠色的三角標開始,而後你就能夠進入到 Node.js 源碼中 C/C++ 部分的調試了。

參考

相關文章
相關標籤/搜索