我有一个应用程序,它会抓取一堆URL。有时它会随机锁定100%的CPU使用率。无论发生什么事情,它都处于一种状态,它永远不会返回到事件循环,因为我失去了对节点检查器做任何事情的能力,我的logstash事件停止被触发,strace告诉我没有进一步的系统调用等等。
我希望能够附加GDB,看看我是否可以通过这种方式获得某种洞察力。我找到了雷米夏普的一篇文章,他可以通过这里的节点来做到这一点:https://remysharp.com/2013/09/11/how-i-fixed-an-anonymous-infinite-loop-in-jsbin。不幸的是,io.js使用的新版V8已经发生了变化。我发现,当我按照他的例子时,我被困在他跑print 'v8::V8::TerminateExecution'(0)
的位置。 V8显然已从API中删除TerminateExecution
函数(请参阅https://stackoverflow.com/a/19408894/918195)。由于对GDB缺乏经验,我无意中试图打电话给v8::V8::TerminateExecution(v8::Isolate*)
,因为该帖子中提到无济于事。
在这一点上,我觉得我将不得不沿着兔子洞挖掘V8源,以了解它是如何工作的,以便只使用GDB来解决这个问题。我希望尽可能避免这种情况。
有关如何使用GDB和io.js的任何建议或其他方法来查找导致我的进程在100%CPU挂起的代码(我猜测某些无限循环条件 - 可能在第三方库中我正在使用)?