Node.js 源代码调试的4种姿势

Node.js 源代码调试的4种姿势

本文从以下4个方面简单介绍一下与Nodejs相关源码调试:

  • js源代码调试
  • C++源代码调试
  • 同时调试js源代码和C++源代码
  • node C++扩展程序源代码调试

调试js源代码

  • 调试js文件非常容易,直接在启动node程序时增加--inspect-brk参数即可
  • 接着可以使用chrome-dev-tools或vs-code接入调试
  • 笔者推荐chrome-dev-tools,至于为何,因为vs-code中的js-debugger插件会导致CPU风扇"狂转",猜测是兼容问题,这大概是插件式IDE的通病,插件一多,CPU就飞起来了
  • 通过以下方式开启js源码调试,这种调试对于一般的业务场景已经足够用
$ node --inspect-brk hello.js
Debugger listening on ws://127.0.0.1:9229/ed895759-db8b-42ae-84c2-807535c53928
For help, see: https://nodejs.org/en/docs/inspector
Debugger attached.

过程比较简单,这里不再赘述。

调试C++源代码

预先安装好C/C++ extension

node-cppdb

$ ./configure --debug
$ make -j4

在获得debug版本后,配置vs-code调试环境,在launch.json文件中添加如下配置信息:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(lldb) Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/node-10.15.1/out/Debug/Node", // => 这里指向node编译后的debug文件
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "lldb"
        }
    ]
}

node_main.cc文件中Start函数处打上断点,接着启动vs调试,可以愉快的进行step by step.
node-src-db

同时调试C++和js源代码

在vs-code中修改launch.json配置,添加args参数如下:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(lldb) Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/node-10.15.1/out/Debug/Node",
            "args": [
                "--inspect-brk",
                "/path/to/debug/index.js"   // => 这里替换成你要调试的js入口文件,最好是绝对路径
            ],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "lldb"
        }
    ]
}

启动调试过程同上,我们可以vs-code中调试c++代码,在chrome-dev-tools调试js代码,两不耽误。
在对nodejs源代码进行调试时增加入口参数,有助于我们理解js代码在node内是如何被处理的。

调试C++扩展程序源代码

请提前安装好lldb插件
node-lldb

对于node c++ 扩展调试共有两种方式

  • 启动调试
  • 附加进程

启动调试配置

首先在vs-code launch.json中增加如下配置,接着在想要监控的地方打上断点

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Debug node C++ addon",
            "type": "lldb",
            "request": "launch",
            "program": "node",
            "args": ["${workspaceFolder}/node-training/node-addons/hello/hello.js"],
            "cwd": "${workspaceFolder}/node-training/node-addons/hello"
        }
    ]
}

附加进程调试配置

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Attach node C/C++ Addon",
            "type": "lldb",
            "request": "attach",
            "pid": "${command:pickMyProcess}"  // => 附加到进程
        }
    ]
}

附加进程调试,可以在控制台中启动node进程后,通过vs-code调试面板再启动附加进程调试
node-addon-db
node-addon-db0

遇到问题

  • vs-code中代码飘红如何解决?
    node-cpp-error

  • 在setting中增加如下语句解决

"C_Cpp.errorSquiggles": "Disabled"

node-cpperror

  • vs code中,如何在调试启动前增加一个preLaunchTask?
    • 按下shift + cmd + p,输入Task,选择Tasks: Configure Task
    • 接着可以搜索当前项目下所有的scripts脚本,选择需要配置的任务
    • 然后vs code中在.vscode文件夹生成一个task.json,同时增加上一步选择的任务
    • 最后将task中的label内容放置到launch.json中需要配置preLaunchTask的调试项目中
    • 启动调试即可看到刚刚配置的任务会预先执行
      vscode-db-pretask

参考文档

风清洋

风清洋

保持原动力,迎接每一天

评论