内核恐慌日志在哪里?

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

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

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

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

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之间接口的设备来解决。 但是有些设备可以在两者之间进行转换。

串口如下所示:

通过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

一步调试

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

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

  • QEMU或其他虚拟机: https : //stackoverflow.com/a/42316607/895245
  • JTAG

一旦您拥有完全可见性(并且有足够的时间!),每个问题都会失败