当前位置: 首页>>技术问答>>正文


内核恐慌日志在哪里?

, ,

问题描述

我有Handbrake /ffmpeg的问题。转码约5分钟后,电脑锁定。我很确定这是一个内核恐慌,因为caps-lock开始闪烁。

有一些关于该做什么和一些关于具体错误的逻辑问题,但我真的在追求一件事:在一切都死之前发生了什么?!

我已经检查了/var/log/kern.log,我所看到的只是我在DVD中粘贴,然后几分钟后,系统启动了。没有错误,没有恐慌通知。

有没有办法强制记录恐慌?我很确定我可以重现这个(这是我最近尝试过的100%)所以虽然我宁愿这个”just worked”,但我很高兴重启几次,如果这意味着我能找到原因恐慌

最佳解决思路

Ubuntu中的所有系统日志都由rsyslog处理,后者将其配置保存在/etc/rsyslog.conf/etc/rsyslog.d/中。

有关如何配置rsyslog以及可能的选项的更多信息,请访问rsyslog.conf man page

打开/etc/rsyslog.d/50-default.conf,您可以看到其中一行包含

*.*;auth,authpriv.none -/var/log/syslog*

这意味着在这种情况下您要查找的文件是您可能拥有的任何巨大的/var/log/syslog日志。

您可以看到文件名也以-开头,这意味着文件在写入之前被缓存,它很棒,但可能会给您留下不好的日志,您想要的是一旦出现问题就写入日志。删除短划线并重新启动或重新加载rsyslog,然后再次使计算机崩溃,请检查/var/log/syslog

次佳解决思路

如果它确实是内核恐慌,那么它将不会通过常规方法写入日志。由于内核崩溃了,写入文件系统是一项危险的操作 – 内核不再可信任,因此写入日志实际上可能会在引导加载程序上随意乱扔垃圾!

相反,您可以将内存的内容转储到交换中,然后再进行调试。这称为内核崩溃/核心转储。

Ubuntu Wiki有一个可能有用的CrashdumpRecipe – 虽然它看起来有些过时,但我认为不应该有太多变化。

第三种解决思路

串行端口

串行端口是计算机之间的简单低级通信机制。

好处:

  • 简单设置一次(如果你有硬件)

  • 可靠,因为数据传输仅依赖于简单的线路和内核API,它比TCP /IP子系统更不容易受到恐慌的影响。

缺点:

  • 大多数现代笔记本电脑不再具有串口(暴露?)以节省空间。但台式机和虚拟机仍然可以。

  • 你还需要第二台带有串口的计算机来接收数据,但基本上所有的嵌入式开发板都是如此,例如Raspberry Pi。

  • 受物理层串行电缆长度的限制,不同于无限制的TCP /IP网络。但是,这可以通过串行和TCP /IP之间接口的设备来解决。但是有些设备可以在两者之间进行转换。

串口如下所示:

kernel,log,ubuntu

通过GPIO可以获得RPI。

然后,如果您有所需的硬件,请使用以下命令从第二台计算机连接到主计算机:

screen /dev/ttyS0 115200

这实际上给你一个shell。

然后在主机上启动恐慌操作。

当恐慌发生时,恐慌转储将流式传输到第二台机器,您可以通过在终端上向上滚动来查看所有内容。

其他方法

还有其他方法克服了上述硬件限制,代价是更复杂和更不可靠。值得注意的方法:

  • netdump:通过TCP /IP传播恐慌。依赖于TCP /IP子系统未被破坏。

  • kdump:似乎是在下面提到的linux-crashdump的基本机制:https://askubuntu.com/a/104793/52975启动第二个Linux内核来检查崩溃的内核。什么可能出错?! 🙂

另见这个伟大的答案:https://unix.stackexchange.com/questions/60574/determining-cause-of-linux-kernel-panic

一步调试

最终,获得恐慌输出需要一些内核功能,并且任何内核功能都可能被恐慌所破坏。

但是,如果你可以在内核上使用GDB,谁还需要恐慌?如果你是那个硬核,请看看:

一旦你有完全的可见性(和足够的时间!),每个问题都会失败。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/7027.html,未经允许,请勿转载。