25

我在我的设备上使用了一个 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 (存在于我的设备上)。其次,RAM 在重新启动后也不包含日志,因为它似乎已被清除 - 或者日志也没有写入。

那么在恐慌之后如何获取内核日志呢?如果有一种方法可以在正在运行的系统上测试 APANIC,那也会很有帮助。也许通过使用内核调试系统?到目前为止,我对此很陌生。

提前感谢您的帮助!

4

5 回答 5

27

至于我,

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。

于 2012-11-12T15:04:02.263 回答
17

好像在Android-7.0以上,last_kmesg日志移到:/sys/fs/pstore/console-ramoops,所以试试:

cat /sys/fs/pstore/console-ramoops

它在 nexus-5x 上对我很有效

于 2017-11-02T05:07:33.193 回答
9

/data/dontpanic文件夹呢?发生内核崩溃后,您可以将 USB 线连接到您的 Android 设备并通过ADB.

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

apanic_console

apanic_threads

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

于 2012-05-09T22:30:34.307 回答
3

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

cat /proc/last_kmsg

更多信息参见内核代码@drivers/staging/android/ram_console.c

于 2013-05-13T19:17:38.237 回答
1

我遇到了在 Android 中收集关机日志的类似问题。我很久以前就发布了这个问题,它有两种方法。我使用第二个,因为第一个对我不起作用。这是问题

Android 在哪里存储关机日志?

希望这可以帮助。

于 2012-03-14T17:31:34.630 回答