javascript - 为什么我的 Node.js 得到 "program terminated"而没有错误

标签 javascript node.js debugging segmentation-fault

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

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

我所知道的分割:

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

关于要求:

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

同样,这段代码已经运行了几个月。当我开始注意到这一点时,我一直在进行一些相当广泛的更改(但不是使用上面提到的 require 的代码区域)。由于我经常可以在看到这个之前通过许多不同的代码路径毫无问题地运行几分钟,所以很难说是什么触发了这个。

我还能在这里做什么?!

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

最佳答案

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

  • 至于具体错误,它似乎是一个 Node.js 错误
  • 至于“为什么我会收到这个错误?”的问题继续阅读...

原因

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

找出原因

要找出为什么 node 终止几个选项很有效:

  1. 安装 node-segfault-handler .
  2. 使用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 和您的程序或附加它。要调试调试器(就像我的情况一样),步骤如下:

  1. 在 shell 中,在前面加上 gdb --args 运行您的 Node 应用程序,例如gdb --args node debug main.js
  2. 在 gdb 提示符下,输入 run
  3. 等待崩溃。一旦你点击它,输入 bt 来获取堆栈信息,或者调试!

关于javascript - 为什么我的 Node.js 得到 "program terminated"而没有错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35029880/

相关文章:

javascript - ApplicationRoute 是处理全局反序列化的最佳方法吗?

api - 请求模块出错

java - 我怎样才能找到打印调用的位置?

javascript - Javascript 中的 Tds 自动化

javascript - 在多个 div 之间自动淡入淡出/显示

javascript - 将图像上传到未定义的 Node.js image'

mysql - 如何在 SQL 脚本中使用过程?

c++ - 使用 qt creator 进行 jit 调试 (Windows)

javascript - 从页面顶部获取项目偏移量

node.js - 我如何使用仅具有 Apollo Server 2 graphql 端点的快速中间件