我有一个用C ++编写的node.js模块,它为C ++库提供了一些绑定。库与SIGSEGV崩溃,因此我需要使用GDB调试它并找出问题所在。
我已经在./node_modules/somelib/
中拥有该模块的来源,如果我转到该文件夹并输入npm install
,则该库已编译并可通过require(' somelib&#39)使用;)来自node.js.我可以将gdb附加到节点并重现错误,但在堆栈跟踪中我只看到node_modules/somelib/Release/somelib.node
。
我不确定这是否重要但是库是使用node-gyp
编译的。
node-gyp
以生成调试符号?答案 0 :(得分:16)
我刚在node-gyp
文档中找到了答案。解决方案是使用--debug
标志调用构建过程。这意味着要调用node-gyp configure --debug
和/或node-gyp build --debug
。然后,将创建Release
文件夹而不是Debug
文件夹。然后gdb将自动加载源文件。
答案 1 :(得分:2)
从@Peter Cordes提供的(现已断开)链接的archive中无耻地复制
首先,使用带有--debug标志的node-gyp编译加载项。
$ node-gyp --debug configure rebuild
第二,如果您仍然像我一样处于“游乐场”模式,则可能是通过类似的方式加载模块
var ObjModule = require('./ObjModule/build/Release/objModule');
但是,当您在调试模式下使用node-gyp进行重建时,node-gyp会丢弃Release版本,而是创建一个Debug版本。因此,更新模块路径:
var ObjModule = require('./ObjModule/build/Debug/objModule');
好的,现在我们可以调试我们的C ++插件了。针对节点二进制文件(这是C ++应用程序)运行gdb。现在,节点本身不知道您的插件,因此,当您尝试在插件函数(在本例中为StringReverse)上设置断点时,它抱怨未定义特定函数。不用担心,您的加载项是它所指的“未来共享库加载”的一部分,一旦您在JavaScript中使用require()加载项,就会加载该加载项。
$ 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
答案 2 :(得分:0)
您可以将包含模块源的目录添加到gdb的搜索路径中:
(gdb) directory /path/to/source
请参阅:http://sourceware.org/gdb/onlinedocs/gdb/Source-Path.html
另外,要获取node-gyp
调试符号,请安装node-gyp-dbg/dev
或等效代码,或使用-g
答案 3 :(得分:0)
如果您是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 Code中一样设置断点。
调试愉快!
如果您需要更详细的说明,我也在这里发布了详细的博客。
https://medium.com/@atulanand94/debugging-nodejs-c-addons-using-vs-code-27e9940fc3ad