本文从以下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源代码,https://github.com/nodejs/node
- 笔者推荐下载指定tag的包,特别是经过充分测试的稳定版,对于新手来说,这可以规避很多不必要地踩坑,节省时间,提升上手体验
- 本文以 https://github.com/nodejs/node/releases/tag/v10.15.1 版本为例
- 通过以下命令编译出debug版本,详细可以参见node-building文档
$ ./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
.
同时调试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 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调试面板再启动附加进程调试
遇到问题
-
vs-code中代码飘红如何解决?
-
在setting中增加如下语句解决
"C_Cpp.errorSquiggles": "Disabled"
- vs code中,如何在调试启动前增加一个preLaunchTask?
- 按下
shift + cmd + p
,输入Task
,选择Tasks: Configure Task
- 接着可以搜索当前项目下所有的scripts脚本,选择需要配置的任务
- 然后vs code中在
.vscode
文件夹生成一个task.json
,同时增加上一步选择的任务 - 最后将task中的label内容放置到launch.json中需要配置
preLaunchTask
的调试项目中 - 启动调试即可看到刚刚配置的任务会预先执行
- 按下
评论