我有一个相当大的Node.js项目,在广泛的开发阶段中一直表现出色。但是,最近-不幸的是无法确切指出更改的时间-我的应用程序program terminated
仅在从node.js调试器中运行时才开始退出。
最大的问题:如何找出导致此错误的原因?
我所知道的细目:
node debug main.js
)SIGINT
,exit
也不uncaughtException
是命中console.log()
我能够确定在我require
使用模块时会发生这种情况(有关此问题的更多信息,请参见下文)require
逻辑被包围try
/catch
但它不赶domain
的error
处理程序通过将require
部分放入run
方法中来捕获此内容,但没有捕获任何内容关于要求:
我的程序有一个“插件”类型的系统,其中的模块可以require
在运行时根据需要添加。但是,根据require
我所知道的,不确定性是不确定的:可以require
连续成功几次的模块有时会失败。
同样,这是已经使用了几个月的代码。require
当我开始注意到这一点时,我一直在进行一些相当广泛的更改(但没有对上面提到的代码区域进行更改)。由于我经常可以运行几分钟,尽管通过许多不同的代码路径可以毫无问题地看到它,所以很难说是什么触发了这一点。
我还能在这里做什么?
作为参考,代码(不是很及时,因为我还没有推送更改)在Github上,如果有帮助的话。
经过更多的挖掘和询问后,我得到了一些答案,所以我自己回答:
原因
当Node.js本身遇到段错误时,该程序(例如.js)将停止。您将不会获得异常,执行错误处理程序等。因为底层node
已经死亡。如果您在调试器下运行,则只会看到消息program terminated
。
找出原因
要找出为什么node
终止几个选项效果很好:
gdb
节点段故障处理程序
node-segfault-handler
是模块中的一个分支,当发生爆炸时,它将为您提供基本的调用堆栈。简单地将require
其初始化在您index.js
或您的等效物的顶部:
var SegfaultHandler = require('segfault-handler');
SegfaultHandler.registerHandler("crash.log");
有关更多信息和用法,请参见作者页面。
gdb
有了它,gdb
您可以获得更多可读的堆栈信息,并在需要时进行真正的调试。请注意,导致Node.js分段错误的常见原因是您可能使用的本机模块。如果是这种情况,最好用调试符号(重新)构建它们,这样您的堆栈跟踪就很有用了。本机模块通常使用node-gyp。在这种情况下,找到modulesbinding.gyp
文件的cflags
成员并将其添加-g
。sqlite3包中的示例:
"cflags": [ "-include ../src/gcc-preinclude.h", "-g" ],
接下来重建您更新的模块:
npm rebuild --build-from-source sqlite3
最后,在node
您的程序下执行gdb
或附加它。要调试调试器(如我的情况),步骤将如下所示:
gdb --args
,例如gdb --args node debug main.js
run
bt
以获取堆栈信息,或进行调试!本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句