最近一年一直在从事Electron开发工作。在Electron开发中,基于Node.js的开发可以说是极其重要的一部分。我首先遇到的问题就是如何开发调试Node Native Addons。由于Node Native Addons主要是使用C++语言开发,而在JavaScript环境下调用,所以我们必须跨语言环境进行开发调试。

开发前的准备

首先需要安装node-gyp,它是用来构建开发、编译node原生模块环境的跨平台命令行工具。

1
npm install node-gyp -g

开发

创建一个项目目录,并进入到目录下,

1
mkdir demo && cd demo

接着使用npm初始化项目,

1
npm init

一路回车就生成了package.json,接着我们需要创建这个模块项目的编译配置文件binding.gyp

1
touch binding.gyp

在文件中写入以下配置

1
2
3
4
5
6
7
8
{
"targets": [
{
"target_name": "addon", // 构建目标名称
"sources": [ "addon.cc" ] // 目标的源文件
}
]
}

接下来便是创建上面配置所说的源文件,

1
touch addon.cc

接下来在源文件中添加以下demo代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 这段demo代码来自于Node.js 文档 C++ Addons 章节,代码含义是输出字符串“world”
#include <node.h>

namespace demo {

using v8::FunctionCallbackInfo;
using v8::Isolate;
using v8::Local;
using v8::Object;
using v8::String;
using v8::Value;

void Method(const FunctionCallbackInfo<Value>& args) {
Isolate* isolate = args.GetIsolate();
args.GetReturnValue().Set(String::NewFromUtf8(
isolate, "world").ToLocalChecked());
}

void Initialize(Local<Object> exports) {
NODE_SET_METHOD(exports, "hello", Method);
}

NODE_MODULE(NODE_GYP_MODULE_NAME, Initialize)

}

接下来使用

1
node-gyp configure

为当前平台生成项目构建文件,接下来我们会观察到根目录下多了一个 build 文件夹,其中有一些文件,们暂时不关心其中的文件是什么,有什么作用。

继续使用

1
node-gyp build

生成编译 addon.node 文件,这将被放入 build/Release/ 目录中。目录中的其他文件我们仍然暂时不关心,addon.node 才是我们需要关注的重点。这就是编译出来的原生模块。

接下来我们在根目录下创建一个测试文件test.js

1
touch test.js

在文件中引入并使用这个 node 模块

1
2
3
const addon = require('./build/Release/addon');

console.log("hello", addon.hello());

接下来执行

1
node test.js

我们便可以看到命令行中输出了

1
hello world

到这一步,我们的原生模块已经开发好了,并且可以在 js 文件中使用了。

接下来我们讲如何调试。

调试

此处我们主要讲解如何调试 C++ 代码部分。

使用以下命令

1
node-gyp configure --debug -- -f xcode

生成 Xcode 项目文件 binding.xcodeproj,生成位置位于 build 目录下。
我们在 Finder 中双击此文件用 Xcode 打开。

点击下图框中的位置


选择 Edit Scheme...


Run 分栏下选择 Info 卡片,点击 Executable 后的选择框,选择 Other...


找到 node 可执行文件所在的位置,选择 node 可执行文件。


得到如下结果


切换到 Arguments 卡片下,点击 Arguments Passed On Launch 下的 + 按钮,


添加一项内容,内容是 test.js 文件的绝对路径,


如此一来我们就配置好了,接下来我们来调试,在 addon.cc 中设置一个断点(下图黄框处),之后点击运行按钮(下图绿框处),


我们可以看到代码停止在了断点处,侧栏及底栏也显示出了相应的调试信息,


点击上图黄框处按钮跳过断点,我们得到了最终运行结果(下图黄框处),


到此为止,我们已经在 Xcode 中完成了一次调试。

相信通过此篇文章的讲解我们都可以学会如何利用 Xcode 调试我们的 node 原生模块,此篇文章到这里也就结束了。如果有什么问题,欢迎向我提问

Tips

如果你不知道你的node环境路径是什么,请使用which node命令查看。

Finder 下使用 Shift + Command + G 快速跳转到相应路径位置。

本文参考文献
Node.js 文档 C++ Addons 章节
GYP3 文档
Debug Node.js native addon with Xcode