从外部获取正在运行的Node.js的当前堆栈跟踪

6
我有一个Node应用程序,在生产服务器上定期会出现100%的CPU占用率。我希望能够发送一个信号给Node进程,以便我可以获取堆栈跟踪信息,从而找到问题所在的代码位置。 是否有简单的方法来实现这个功能?
我的服务器是Ubuntu 14.04.2,运行的是Node 0.12.2版本。
2个回答

1

-1

有一个名为console.trace()的函数可以帮助您实现您想要做的事情。

如何在Node.js中打印堆栈跟踪?

使用以下代码在进程上设置事件处理程序以监视SIG1:

process.on('SIGUSR1', function(){   console.trace   });

现在,从终端发出以下命令以向 Node 发送 SIGUSR1 信号:

killall -10 node

我不确定堆栈跟踪是否足够详细,以便对您有用,它可能只会显示SIG1USR回调函数,不确定。但我认为这将使您更接近答案。


感谢您的回复,Brian。我相信这只会显示它所在函数的堆栈跟踪,也就是SIGUSR1事件处理程序的堆栈,而不是无限循环所在位置的堆栈跟踪。 - Dirk
我认为使用SIGUSR1信号的建议并不会有所帮助。在接收到该信号时,进程将等待完成其正在执行的操作。事件循环必须先停下来处理SIGUSR1,如果它被卡在某个操作中,就永远无法到达那里。 - George Simms
在我的测试中,当程序处于长循环状态时,它无法处理 SIGUSR2 事件,直到循环结束。 - Dirk
没错,这就是我在测试中看到的,George。 - Dirk
这是在process.on('SIGUSR2')事件处理程序中的跟踪输出: at process. (worker.js:14:13) at process.emit (events.js:104:17) at Signal.wrap.onsignal (node.js:655:46) - Dirk

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