Node.js 原始碼除錯

prerabale發表於2019-04-28

任何資訊的價值都有時效性和適用性,本文寫時 Node.js 的最新發行版是 v11.14.0LTSv10.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 是基於 V8libuv 進行構建的,底層是以 C/C++ 實現,而標準庫部分則是採用 JS 編寫。所以 Node.js 的原始碼除錯分為兩部分,C/C++ 程式碼除錯和 JS 程式碼除錯。更多...

準備工作

  1. Node.js 原始碼一份
  2. Visual Studio Code 或其它除錯 C/C++JS偵錯程式/IDE

開始除錯

編譯

發行版本的 Node 是不支援除錯的,所以我們需要自己通過原始碼構建一份可除錯的 NodeNode 專案構建通過 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 部分的除錯了。

Node.js 原始碼除錯

之後每次改動你的程式碼的時候都記得執行以下 build.sh 重新執行編譯。

關於 vscode 中 JS 的更多除錯姿勢請看這裡

除錯 C/C++ 原始碼

安裝外掛

Visual Studio Code 預設是不支援 C/C++ 除錯的,需要安裝對應的外掛,開啟 Visual Studio Code 的外掛商店, 搜尋 c++,安裝名為 C/C++ 的官方外掛

Node.js 原始碼除錯

除錯

同 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"
        }
    ]
}
複製程式碼

切記,記得進行儲存。

Node.js 原始碼除錯

然後用 IDE 在 C/C++ 入口檔案處 ./src/node_mian.cc 打上 debugger 標識。 回到設定介面選擇剛剛配置的 "Attact Program",然後點選綠色的三角標開始,然後你就可以進入到 Node.js 原始碼中 C/C++ 部分的除錯了。

Node.js 原始碼除錯

參考

相關文章