持续以 100% CPU 运行是无限循环的典型特征。这是单线程 nodejs 中的一个真正问题,但不幸的是,它缺乏相关信息。
最终我找到了唯一有用的文章:如何在 nodejs 中跟踪死循环:
通过 SSH 连接到您的服务器。识别 nodejs 进程 ID(例如,让它为 4702)。现在,让我们告诉进程监听调试请求。是的,我们正在使用一个名为 kill 的命令。不,我们不会终止进程。我们正在向它发送不同的信号。
kill -SIGUSR1 4702
执行此操作后,该过程将打开调试器连接。实际上,它会在其控制台日志中打印一个特殊的 URL,您可以在 Chrome 中打开该 URL 来调试进程!但是,也许您不想为了建立连接而在防火墙和容器配置中钻一个洞。是的,我也没有。因此,让我们在命令行中进行调试:
node inspect -p 4702
你会看到这个提示:
debug>
然后输入:
pause
你回来了:
break in file:///somewhere/something.js:555
>555 for (prop in inputObject) {
510 if (hasOwnProp(inputObject, prop)) {
511 normalizedProp = normalizeUnits(prop);
是的!我们有第一个提示。该应用程序正在执行文件 something.js 中的第 555 行。这可能足以立即看到错误。但通常我们需要比这更多的信息。您可以键入 backtrace 以获取完整的堆栈跟踪:
#0 someFunctionName file:///somewhere/somefile.js:444:22
#1 someFunctionName file:///somewhere/somefile.js:555:33
#2 someFunctionName file:///somewhere/somefile.js:666:44
… 等等。