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++ 部分的调试了。

参考

相关文章
相关标签/搜索