捕获 Node.js 崩溃原因

10

我有一个用node.js编写的脚本,它使用'net'库并通过tcp与远程服务进行通信。该脚本使用'node script.js >> log.txt'命令启动,并且脚本中使用console.log()函数记录的所有内容都会被写入log.txt,但有时脚本会崩溃,我无法找到原因,并且在脚本崩溃时log.txt中没有任何记录。

如何捕获崩溃原因?


这可能会有所帮助:https://github.com/tlrobinson/long-stack-traces - Davin Tryon
好的,我在脚本中的所有函数都在try/catch块中,所以这也不会记录问题。 - dfilkovi
2个回答

17

你不能监听 uncaughtException 事件 吗?大致如下所示 =>

process.on('uncaughtException', function (err) {
  console.log('Caught exception: ' + err);
});

顺便提一句,按照Felix Geisendörfer的文章建议,在那之后你应该重新启动进程。


1
太棒了!我一直在寻找将堆栈跟踪记录到文件的方法,这当然让我做到了!非常感谢!=D - Robin Heggelund Hansen
1
为了下一个查看此答案的谷歌用户,我在这里添加一些内容。捕获processuncaughtException事件被认为是不好的实践,因为此时node.js进程本身处于未定义状态。您应该使用domains - Shrikrishna Holla
Shrik,你能举个使用域的例子吗?我无法让域在未捕获的异常中工作。 - haz0rd
1
在域名上发生了争执。如果你重新抛出你捕获的错误,那么这个答案会更好。 - Wes Johnson

12

通过拆分stdoutstderr来捕获异常要容易得多。就像这样:

node script.js 1> log.out 2> err.out

默认情况下,Node将普通输出记录在stdout中,我相信您正在使用>>捕获它。

如评论中所述,分段错误是一个由shell发送到stderr的信号,而不一定是由您的程序引起的。有关其他选项,请参见此unix.stackexchange答案。


等等,这跟崩溃有什么关系?当你看到“Segmentation fault: 11”时,以上内容对你没有任何帮助! - Michael
我已经更新了我的答案,如果你有更好的例子建议,请分享给@Michael。 - Wes Johnson

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