【问题标题】:Why is my Node.js getting "program terminated" without an error为什么我的 Node.js 没有错误地“程序终止”
【发布时间】:2016-01-27 06:00:49
【问题描述】:

我有一个相当大的 Node.js 项目,它在很长一段时间内都运行良好。然而最近 - 不幸的是无法准确指出它何时发生变化 - 我的应用程序已开始以 program terminated 退出仅在从 node.js 调试器中运行时

最大的问题:如何找出导致此错误的原因?

我所知道的细分

  • 似乎只在调试器中发生(例如node debug main.js
  • 节点 4.2.5 和 4.2.6 的结果相同。对于 Node 5.5.0,调试器通常会在发生这种情况时停止工作。
  • 没有额外的输出,例如堆栈跟踪或错误消息,只有“程序终止”
  • SIGINTexituncaughtException 的进程事件被命中
  • 通过console.log() 我已经能够确定当我require 一个模块时会发生这种情况(更多信息见下文)
  • require 逻辑被 try/catch 包围,但没有捕获
  • 我曾尝试使用domainerror 处理程序来捕获此问题,方法是将require 部分放入run 方法中,但在那里也没有捕获到
  • 我使用了诸如madge 之类的工具来确保我没有任何循环依赖(也许有更好的方法来做到这一点)

关于要求

我的程序有一个“插件”类型系统,其中的模块在运行时根据需要require'd。冒犯的require 不是我所知道的确定性,但是:一个可以require 连续几次成功的模块在其他时候会失败。

同样,这是已经运行了几个月的代码。当我开始注意到这一点时,我一直在进行一些相当广泛的更改(但不是对上面提到的使用require 的代码区域)。由于我经常可以通过许多不同的代码路径运行几分钟而不会出现问题,因此很难说是什么触发了这种情况。

我还能在这里做什么?!

作为参考,代码is on Github(不是最新的,因为我没有推送我的更改),如果有帮助的话。

【问题讨论】:

  • 说真的,这怎么可能偏离主题/被否决。

标签: javascript node.js debugging segmentation-fault


【解决方案1】:

经过更多的挖掘和询问,我得到了一些答案,所以我会自己回答:

  • 至于具体的错误,好像是Node.js的bug
  • 至于“为什么会出现这个错误?”的问题。继续阅读...

原因

当 Node.js 本身遇到段错误时,程序(例如 .js)将简单地停止。 您不会收到异常、执行的错误处理程序等。因为底层的node 已经死了。如果您在调试器下运行,您将看到的唯一消息是program terminated

找出原因

要找出node 终止几个选项效果很好的原因:

  1. 安装node-segfault-handler
  2. 使用gdb

节点段错误处理程序

node-segfault-handler 是一个插件模块,当事情发生爆炸时,它会给你一个基本的调用堆栈。只需 require 并在 index.js 或等效项的顶部初始化它:

var SegfaultHandler = require('segfault-handler');
SegfaultHandler.registerHandler("crash.log");

有关更多信息和用法,请参阅authors page

gdb

使用gdb,您可以获得更多可读的堆栈信息,并在需要时进行真正的调试。请注意,Node.js 分段错误的常见原因是您可能正在使用的本机模块。如果是这种情况,使用调试符号(重新)构建它们可能是一个好主意,这样您的堆栈跟踪就有一些有用的东西。原生模块一般使用node-gyp。在这种情况下,找到模块binding.gyp 文件的cflags 成员并将-g 添加到其中。 sqlite3 包中的示例:

 "cflags": [ "-include ../src/gcc-preinclude.h", "-g" ],

接下来重建您更新的模块:

npm rebuild --build-from-source sqlite3

最后,在gdb下执行node和你的程序或者附上它。要调试调试器(就像我的情况一样),步骤如下:

  1. 在 shell 中,运行您的节点应用程序,前面带有 gdb --args,例如gdb --args node debug main.js
  2. 在 gdb 提示符下,输入 run
  3. 等待崩溃。点击后,输入bt 以获取堆栈信息,或调试!

【讨论】:

  • 我在 node 4.3.0 版本上遇到了同样的问题,然后我安装了 node^6.2.0 版本,它解决了这个问题。
  • 请注意,您可以在单个 shell 中使用 gdb 进行调试。使用您的示例,gdb --args node debug main.js 将启动 gdb。在 gdb 提示符下,您可以输入 run 来运行 node.js 应用程序,然后在崩溃后输入 bt。 (更新:添加到答案)。
猜你喜欢
  • 2016-07-09
  • 2018-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多