节点错误堆栈跟踪未定义。

4

我有一些长时间运行的Node代码,会在一段时间后打印出[RangeError: Maximum call stack size exceeded]错误,并且会无限制地持续下去。

为了追踪是哪个递归调用导致了这个错误(我找不到任何递归调用使用了setTimeoutprocess.nextTick以外的东西),我做了以下操作:

process.on('uncaughtException', function(error) {
  console.log(error);
  console.log(error.stack);
});

这捕获了错误,但是stack属性是undefined!我尝试抛出自己的错误,stack属性显示了预期的堆栈。Node在堆栈溢出错误中不应该有一个stack吗?我如何确定哪些调用引起了这个问题?


console.trace 产生的信息更有意义吗? - Wex
尝试使用 console.log(error.stack || error)... 如果 error 参数的类型是 Error,它将打印堆栈... 如果它的类型是 String,它将简单地打印消息... - user2879704
1个回答

0

在JavaScript中,您不必抛出Error对象。这甚至可以是一个字符串。因此,当您的应用程序崩溃时,您不能依赖于stack属性被定义。

根据您所描述的情况,您的应用程序存在内存泄漏问题,您应该尝试找到它。有许多在线教程可供参考。还有一个名为memwatch的模块可以找到泄漏,您可以在https://www.npmjs.com/package/memwatch上找到它。


1
无论如何,Stackoverflow异常肯定是“Error”实例。 - Bergi
但是 uncaughtException 事件不会捕获任何未处理的异常吗?除此之外,你可能根本不应该使用它? - crackmigg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接