【问题标题】:node.js and Segmentation faultnode.js 和分段错误
【发布时间】:2015-02-03 16:22:17
【问题描述】:

node.js 进入分段错误时,是否可以检查 javascript 堆栈跟踪?

当前情况如下:我正在运行一个包含几个嵌套async.eachSeries 的脚本,由于某种奇怪的原因导致RangeError: Maximum call stack size exceeded。因此,我通过node --stack-size=1000000 增加了堆栈大小,但留下了分段错误。

这里是脚本的源代码:http://nopaste.info/ca0c118591.html

更新

我也尝试了segfault-handler,但由于某些难以理解的原因,它没有发现我的段错误。

【问题讨论】:

  • 您可以考虑发布您的代码。
  • 这里是脚本的源代码:nopaste.info/ca0c118591.html
  • 哪个版本的节点?
  • @zhon: 哈,这是一篇老帖子。我认为是 2014 年 12 月 5 日的最新版本
  • 尝试重写你的任务,让它异步调用它的回调,也就是说,而不是doTask(task, done);doTask(task, function(err, res) { setImmediate(done, err, res); });

标签: javascript node.js debugging segmentation-fault stack-trace


【解决方案1】:

segfault-handler 模块可以在非 Windows 平台上捕获段错误并生成堆栈跟踪。但是,如果您收到的是 RangeError,那不是段错误。

【讨论】:

  • 增加堆栈大小并“解决”RangeError后的段错误
  • 这很奇怪。 segfault-handler 正确处理了自己的测试分段错误函数SegfaultHandler.causeSegfault(),但不是我的实际错误。
【解决方案2】:

这可能意味着您的代码中某处存在递归。由于 V8 移除了对 TCO(尾调用优化)的支持,调用规模将不断增长,直到爆发。

使用--stack_size 似乎是一个自然的解决方案,但它实际上并没有增加堆栈大小,它告诉 V8 假设存在更大的堆栈大小,而实际上这是由操作系统控制的。

来源:

所以目前(使用 Node.js 8.x)最好的解决方案是停止使用递归函数。

【讨论】:

    猜你喜欢
    • 2011-12-03
    • 2018-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-02
    • 1970-01-01
    • 2020-10-12
    相关资源
    最近更新 更多