![Linux 内核崩溃:如何收集信息?](https://linux22.com/image/69987/Linux%20%E5%86%85%E6%A0%B8%E5%B4%A9%E6%BA%83%EF%BC%9A%E5%A6%82%E4%BD%95%E6%94%B6%E9%9B%86%E4%BF%A1%E6%81%AF%EF%BC%9F.png)
我正在开发一个 node.js 应用程序 --- 它经常使我的 Debian Linux 内核崩溃:计算机变得无响应,甚至不响应“ping”。
在这个阶段,我什至不要求分析或修复崩溃的原因。我没有任何信息可以指出任何具体的事情。计算机只是停止响应,既不显示/var/log/messages
也不dmesg
显示任何消息。
所以我的问题是:我可以使用哪些工具来收集有关崩溃的一些信息?
以下是一些背景细节:
我的 node.js 应用程序不使用网络堆栈。它只是生成两个子进程并child_process.spawn
通过写入文件与它们进行通信,监视文件更改fs.watch
并读取已更改的文件。剩下的只是数据处理。
我在三台电脑上测试过这个问题:
- 在第一个(我的主开发机器)上,系统在启动该应用程序几次后可靠地冻结。
- 在其他计算机(类似于主开发机的 PC 和 digitalocean VPS)上,该应用程序通常运行良好 --- 但在运行数百次后,它冻结了其他计算机。
看来我的主开发机器更容易出现这个问题 --- 但因为冻结也发生在两台不相关的机器上,所以我认为这不是仅限于一台 PC 的纯硬件问题。
由于计算机在启动应用程序后立即冻结,我确信该应用程序会导致此问题。由于一切都停止了(包括对 ping 的响应),我认为 Linux 内核已经崩溃了。
答案1
通常,Linux 内核崩溃会在系统控制台上可见。但是,以防万一它确实是内核崩溃,但在您的情况下,无论出于何种原因您可能想确认它确实是内核崩溃,它都是不可见的。为此,您可以将系统配置为在内核崩溃后自动重新启动,如下所示:配置 Linux 内核恐慌时重新启动。如果系统最终重新启动,那么它确实是内核崩溃,然后您可以专注于该调查路径(堆栈交换站点上有大量相关答案)。
但从你的描述来看,我认为这更有可能是内核挂起或“太忙”的情况,你可以从这里开始:如何调查总挂起的原因?。
最后,由于您观察到根本原因似乎更有可能是您的应用程序,因此我认为它以某种方式导致系统负载过多,导致系统变得无响应。您可以检查您的代码是否有任何长度/无限循环,并尝试限制它们的影响:在一定的执行时间(可能使用一些超时异常)或一定数量的迭代之后等之后中断。如果系统在一段时间后再次响应,然后您会更好地了解代码的哪个区域有问题,以及它如何影响系统。