如何调试nodejs的二进制模块?

时间:2014-04-22 19:51:06

标签: c++ node.js node-gyp

我有一个用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编译的。

  • 问题1:如何加载源代码或将gdb指向源代码?
  • 问题2:如何配置node-gyp以生成调试符号?

4 个答案:

答案 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用户,则可能会发现此信息对于调试模块很有帮助。

基本步骤是:

  1. 安装vscode插件https://github.com/vadimcn/vscode-lldb

  2. 将您的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