我有一个相当大的 Node.js 项目,在很长一段时间内都运行良好。然而最近 - 不幸的是无法准确指出它何时发生变化 - 我的应用程序开始退出并显示程序终止
仅当从 node.js 调试器中运行时。
大问题:如何找出导致此错误的原因?
我所知道的分割:
- 似乎只发生在调试器内部(例如
node debug main.js
) - 与 Node 4.2.5 和 4.2.6 的结果相同。对于 Node 5.5.0,调试器通常会在发生这种情况时停止工作。
- 没有额外的输出,例如堆栈跟踪或错误消息,只有“程序已终止”
SIGINT
、exit
和uncaughtException
的进程事件均未命中- 通过
console.log()
,我已经能够确定当我需要
一个模块时会发生这种情况(更多信息见下文) require
逻辑被try
/catch
包围,但它没有捕获- 我尝试使用
domain
的error
处理程序通过将require
部分放入run
方法,但也没有捕获任何内容 - 我使用过诸如 madge 之类的工具确保我没有任何循环依赖(也许有更好的方法来做到这一点)
关于要求:
我的程序有一个“插件”类型的系统,其中的模块在运行时根据需要require
。据我所知,有问题的 require
不是确定性的,但是:一个模块可以 require
连续几次成功,但其他时候失败。
同样,这段代码已经运行了几个月。当我开始注意到这一点时,我一直在进行一些相当广泛的更改(但不是使用上面提到的 require
的代码区域)。由于我经常可以在看到这个之前通过许多不同的代码路径毫无问题地运行几分钟,所以很难说是什么触发了这个。
我还能在这里做什么?!
作为引用,代码(不是最新的,因为我没有推送我的更改)is on Github ,如果有帮助的话。
最佳答案
经过更多的挖掘和询问,我有了一些答案,所以我会自己回答:
- 至于具体错误,它似乎是一个 Node.js 错误
- 至于“为什么我会收到这个错误?”的问题继续阅读...
原因
当 Node.js 本身遇到段错误时,程序(例如 .js)将简单地停止。 您不会得到异常、执行的错误处理程序等。因为底层 node
已经死了。如果您在调试器下运行,您将看到的唯一消息是program terminated
。
找出原因
要找出为什么 node
终止几个选项很有效:
- 安装 node-segfault-handler .
- 使用
gdb
Node 段错误处理程序
node-segfault-handler
是一个插入式模块,它会在发生问题时为您提供基本的调用堆栈。只需 require
并将其初始化在 index.js
或等效文件的顶部:
var SegfaultHandler = require('segfault-handler');
SegfaultHandler.registerHandler("crash.log");
参见 authors page了解更多信息和用法。
gdb
使用gdb
,您可以获得更多可读的堆栈信息,并在需要时进行真正的调试。请注意,Node.js 段错误的一个常见原因是您可能正在使用 native 模块。如果是这种情况,使用调试符号(重新)构建它们可能是个好主意,这样您的堆栈跟踪就会有用。原生模块一般使用node-gyp .在这种情况下,找到模块 binding.gyp
文件的 cflags
成员并向其添加 -g
。来自 sqlite3 的示例包:
"cflags": [ "-include ../src/gcc-preinclude.h", "-g" ],
接下来重建您更新的模块:
npm rebuild --build-from-source sqlite3
最后,在gdb
下执行node
和您的程序或附加它。要调试调试器(就像我的情况一样),步骤如下:
- 在 shell 中,在前面加上
gdb --args
运行您的 Node 应用程序,例如gdb --args node debug main.js
- 在 gdb 提示符下,输入
run
- 等待崩溃。一旦你点击它,输入
bt
来获取堆栈信息,或者调试!
关于javascript - 为什么我的 Node.js 得到 "program terminated"而没有错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35029880/