Android:如何在内核崩溃后获取内核日志?

32

我正在使用一个Android定制ROM,同时也有一个定制的boot.img(自定义内核+cmdline+ramdisk)。我现在想要在内核恐慌后立即查看内核日志,但不幸的是我无法使用串行控制台。

好消息是:在 Android 的 Linux 内核中似乎有一些专门为此目的编写的源码/模块。例如,以下行在我的内核的.config文件中被激活:

CONFIG_ANDROID_RAM_CONSOLE=y
CONFIG_ANDROID_RAM_CONSOLE_ENABLE_VERBOSE=y
CONFIG_APANIC=y
CONFIG_APANIC_PLABEL="oem_log"

我的问题是:在我强制性地引发内核崩溃,例如通过使用insmod panic.ko命令来加载一个简单的崩溃内核模块之后,似乎没有日志被写入到名为oem_log的MTD(这个MTD存在于我的设备上)。其次,由于可能被清空了,或者日志也没有被写入,所以重启后RAM中也不包含日志。

那么,在内核崩溃后如何获取内核日志呢?如果有一种方法可以在运行系统中测试APANIC,那将非常有帮助。也许可以使用内核调试系统来进行测试?目前我对此还比较陌生。

非常感谢您提供的任何帮助!

5个回答

34
就我个人而言,
cat /proc/last_kmsg

重启后(由于insmod期间的内核恐慌引起),会列出与崩溃相关的消息,例如:
[  424.909515] Kernel panic - not syncing: Fatal exception
[  424.909606] Backtrace: 
[  424.909790] [<c005a5ec>] (dump_backtrace+0x0/0x10c) from [<c05f38dc>] (dump_stack+0x18/0x1c)
[  424.909973]  r6:c5cccf00 r5:00000000 r4:c08505a0 r3:00000000

所以你至少可以试试看。我正在使用Galaxy Nexus上的Linux 3.0.31-g4f6d371。

我将此标记为正确答案 - 但它似乎只在特定设备上正确实现了该功能。对于我来说(在我提出问题并针对我的特定设备),情况并非如此。 - mreichelt
2
如果设备没有发生紧急情况,这个文件是否存在。 - Suici Doga
1
不存在,内核版本为3.0.8+。 - ogurets
https://android.stackexchange.com/questions/239500/analyzing-boot-loop-root-cause-from-console-ramoops-0-logcat this question carrying a bounty might be of intrest if you are that 'colonel' of kernel - user1874594

22

在Android 7.0或以上版本中,last_kmesg日志已经被移动到/sys/fs/pstore/console-ramoops,请尝试:

cat /sys/fs/pstore/console-ramoops

它在我的Nexus-5X上运行良好。


8
对我来说,这句话的意思是执行命令cat /sys/fs/pstore/console-ramoops-0 - nyanpasu64
是的,它可以将ID作为后缀添加。 - zhiqiu
如果您是root用户,这将起作用,通常意味着您需要对设备进行root。在三星手机上,一旦烧毁保险丝,您将无法安装标准操作系统。 - Hrvoje

10

如何处理 /data/dontpanic 文件夹?发生内核恐慌后,您可以使用 USB 线连接 Android 设备,并通过 ADB 检查该文件夹中的文件。

我发现这个文件夹在内核恐慌发生后会包含一些 apanic 文件。例如,如果刚刚发生了内核恐慌并且您前往检查文件夹,您可能会发现以下两个文件:

apanic_console

apanic_threads

您可以在 apanic_threads 中找到导致内核恐慌时正在运行的线程 / 进程。在 apanic_console 中,您可能会找到更多信息,例如堆栈跟踪和某些关键寄存器的值: PCLR 等。它们将帮助您开始调试。


1
我有这个文件夹,但里面没有文件(在紧急情况之后)。执行了“find / -name” * panic *“”,发现了一些有趣的东西:“/ sys / module / kernel / parameters / panic”和“/ proc / sys / kernel / panic”,在我的设备上都包含“2”。 - ogurets
非常好的提示。谢谢! - imbr

3

Android会创建一个RAM控制台,并尝试在RAM中保存上一个内核消息缓冲区(假设电源没有中断)。您可以通过proc接口访问此文件,在我的系统上,它是可读的:

cat /proc/last_kmsg

如需了解更多信息,请查看内核代码 @ drivers/staging/android/ram_console.c


现代 Android 版本中路径不存在(已测试 13,路径丢失)。 - gyorgyabraham

1

我曾经遇到过一个类似的问题,就是在Android中收集关机日志的问题。我很久以前发布了这个问题,并且有两种方法可以解决。由于第一种方法对我不起作用,所以我使用了第二种方法。以下是这个问题:

Android存储关机日志的位置在哪里?

希望这可以帮到你。


不幸的是,所有在那里描述的文件只有在APANIC模块正常工作时才可用 - 这就是我正在努力实现的... - mreichelt
@mreichelt,连接adb并尝试拉取kmsg没有成功吗? - Pavan Manjunath
kmsg 是当前的日志。我想要获取内核崩溃发生之后的内核日志,也就是当系统崩溃并且设备重新启动时。这就是 APANIC 的作用。 - mreichelt
如果你想找出是什么导致了内核崩溃,那么我认为与崩溃相关的内核日志对你来说应该很有用。无论是在之前还是之后,据我所知,内核日志始终在kmsg中。 - Pavan Manjunath

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接