21

我有一个用 C++ 编写的 node.js 模块,它为 C++ 库提供了一些绑定。该库因 SIGSEGV 崩溃,因此我需要使用 GDB 对其进行调试并找出问题所在。

我已经有了模块的源代码,./node_modules/somelib/如果我转到该文件夹​​并键入npm install库,则该库已编译,并且可以通过 node.js 中的 require('somelib') 使用。我可以将 gdb 附加到节点并重现错误,但在堆栈跟踪中我只看到node_modules/somelib/Release/somelib.node.

我不确定这是否重要,但该库是使用node-gyp.

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

4 回答 4

19

node-gyp我刚刚在文档中找到了答案。--debug解决方案是使用标志调用构建过程。这意味着调用node-gyp configure --debug和/或node-gyp build --debug。然后将创建一个文件夹而不是Release文件夹。Debug然后 gdb 将自动加载源文件。

于 2014-04-22T21:04:57.200 回答
5

从@Peter Cordes 提供的(现已损坏)链接的存档中无耻地复制

首先,使用带有 --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++ 插件了。对节点二进制文件运行 gdb,这是一个 C++ 应用程序。现在,节点本身并不知道您的插件,因此当您尝试在插件函数(在本例中为 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
于 2018-10-11T15:00:36.650 回答
0

您可以将包含模块源的目录添加到 gdb 的搜索路径:

(gdb) directory /path/to/source

请参阅:http: //sourceware.org/gdb/onlinedocs/gdb/Source-Path.html

此外,要获取node-gyp调试符号,安装node-gyp-dbg/dev或等效,或编译它-g

于 2014-04-22T19:54:25.213 回答
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

于 2018-07-04T14:33:02.580 回答