问题描述
我有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之间接口的设备来解决。但是有些设备可以在两者之间进行转换。
串口如下所示:
通过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,谁还需要恐慌?如果你是那个硬核,请看看:
-
JTAG
一旦你有完全的可见性(和足够的时间!),每个问题都会失败。