如何调试nodejs的二进制模块
How to debug binary module of nodejs?
我有一个用C++编写的node.js模块,它为C++库提供了一些绑定。该库与SIGSEGV一起崩溃,所以我需要使用GDB对其进行调试,并找出问题所在。
我在./node_modules/somelib/
中已经有了模块的源代码,如果我转到那个文件夹并键入npm install
,就会编译该库,并且可以通过node.js中的require("somelib")使用。我可以将gdb附加到node并重现错误,但在堆栈中我只看到node_modules/somelib/Release/somelib.node
。
我不确定这是否重要,但库是使用node-gyp
编译的。
- 问题1:如何加载源代码或将gdb指向源代码
-
问题2:如何配置
node-gyp
以生成调试符号
我刚刚在node-gyp
文档中找到了答案。解决方案是使用--debug
标志来调用构建过程。这意味着调用node-gyp configure --debug
和/或node-gyp build --debug
。然后将创建Debug
文件夹而不是Release
文件夹。gdb将自动加载源文件。
从@Peter Cordes提供的(现已断开的)链接档案中可耻地复制
首先,使用带有--debug标志的node-gyp编译插件。
$ node-gyp --debug configure rebuild
其次,如果你仍然像我一样处于"操场"模式,你可能正在用之类的东西加载你的模块
var ObjModule = require('./ObjModule/build/Release/objModule');
但是,当您在调试模式下使用node-gip重建时,node-gip会丢弃Release版本,转而创建debug版本。因此更新模块路径:
var ObjModule = require('./ObjModule/build/Debug/objModule');
好了,现在我们准备调试我们的C++插件了。对节点二进制文件运行gdb,这是一个C++应用程序。现在,节点本身并不知道您的加载项,所以当您试图在加载项函数(在本例中为StringReverse)上设置断点时,它会抱怨没有定义特定的函数。不用担心,您的插件是它所指的"未来共享库加载"的一部分,一旦您需要()JavaScript插件,就会加载它。
$ gdb node
...
Reading symbols from node...done.
(gdb) break StringReverse
Function "StringReverse" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
好的,现在我们只需要运行应用程序:
(gdb) run ../modTest.js
...
Breakpoint 1, StringReverse (args=...) at ../objModule.cpp:49
如果您是VSCode用户,您可能会发现这对调试模块很有帮助。
基本步骤是:
-
安装vscode插件https://github.com/vadimcn/vscode-lldb
-
将您的launch.json设置为如下所示:
{
"version": "0.2.0",
"configurations": [{
"type": "lldb",
"request": "launch",
"name": "Launch Program",
"program": "/absolute/path/to/node",
"args": [
"/absolute/path/to/your/index.js"
]
}]
}
然后像在VS代码中那样设置断点。
调试愉快!
如果你想要更详细的解释,我也在这里发布了一个详细的博客。
https://medium.com/@atulanand94/调试-nodejs-c-addons-using-vs-code-27e9940fc3 ad
您可以将包含模块源的目录添加到gdb的搜索路径:
(gdb) directory /path/to/source
请参阅:http://sourceware.org/gdb/onlinedocs/gdb/Source-Path.html
此外,要获得node-gyp
调试符号,请安装node-gyp-dbg/dev
或等效程序,或使用-g
编译
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 有根的二进制搜索树.保留与其父级的链接
- 多态二进制函数
- 正在读取二进制文件(is_open)
- visual在c++中将十进制数转换为二进制数
- C++十进制到二进制,如何转换
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- 二进制搜索树叶数问题
- 如何将一个ostringstream十六进制字符串字符对转换为单个unit8t等价的二进制值
- 为什么二进制搜索在我的测试中不起作用
- 重载==不适用于二进制树
- 正在尝试重载二进制搜索树分配运算符
- 在C++中将类(带有Vector成员)保存为二进制文件
- 如何从二进制文件中读取字符串
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 带有数组键C++的二进制映射
- 如何将二进制格式的 C++ 对象的 std::vector 保存到磁盘?
- 二进制数之和(使用C样式字符串)
- 如何从dicom文件中读取二进制数据
- 如何调试nodejs的二进制模块