【问题标题】:Android: How to get kernel logs after kernel panic?Android:内核崩溃后如何获取内核日志?
【发布时间】:2012-03-13 10:29:47
【问题描述】:

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

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

提前感谢您的帮助!

【问题讨论】:

    标签: android linux-kernel root logging panic


    【解决方案1】:

    对于我来说,

    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。

    【讨论】:

    • 我将此标记为正确答案 - 但它似乎只有在针对特定设备正确实施此功能时才有效。对我来说(当时我问这个问题和我的特定设备)并非如此。
    • 这个文件是否存在是设备没有恐慌
    • 不存在,内核版本 3.0.8+。
    • https://android.stackexchange.com/questions/239500/analyzing-boot-loop-root-cause-from-console-ramoops-0-logcat 如果您是kernel 的“上校”,这个带有bounty 的问题可能会引起您的兴趣
    【解决方案2】:

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

    cat /sys/fs/pstore/console-ramoops
    

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

    【讨论】:

    • 对我来说是cat /sys/fs/pstore/console-ramoops-0
    • 可以,可以加id作为后缀。
    【解决方案3】:

    /data/dontpanic 文件夹怎么样?发生内核崩溃后,您可以将 USB 线连接到您的 Android 设备并通过 ADB 检查该文件夹中的文件。

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

    apanic_console

    apanic_threads

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

    【讨论】:

    • 我有这个文件夹,但里面没有文件(恐慌之后)。执行 'find / -name "panic"' 发现了一些有趣的东西:"/sys/module/kernel/parameters/panic" 和 "/proc/sys/kernel/panic",都包含 "2 " 在我的设备上。
    • 很好的提示。谢谢!
    【解决方案4】:

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

    cat /proc/last_kmsg
    

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

    【讨论】:

      【解决方案5】:

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

      Where does Android store shutdown logs?

      希望这会有所帮助。

      【讨论】:

      • 不幸的是,那里描述的所有文件只有在 APANIC 模块正常工作时才可用 - 这就是我想要实现的目标......
      • @mreichelt 连接到adb 并尝试拉动kmsg 不走运?
      • kmsg 是 当前 日志。我想获取内核日志发生内核恐慌之后,即当系统崩溃并且设备重新启动时。这就是 APANIC 的目的。
      • 如果您想找出导致内核崩溃的原因,那么我认为您应该对导致崩溃的内核日志感兴趣。无论是之前还是之后,AFAIR 内核日志总是在 kmsg 中
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-29
      • 1970-01-01
      • 2018-05-24
      • 2011-04-08
      • 1970-01-01
      相关资源
      最近更新 更多