[MTK] 深入了解Logging Tools 之 kmsg

文摘 无标签 2020-03-14 阅读:8285

kmsg

在前面 Kernel Log 章节我们有讲过,所有的 Kernel Log 都会输出到 Kernel 里面的一个循环的缓冲区 'log_buf',为了能够方便的在 user space 读取 Kernel log,Kernel driver 里面将这个 buffer 映射到了 /proc 目录下的文件节点 /proc/kmsg

所以读取 /proc/kmsg 文件其实就是在访问 Kernel Log 的循环缓冲区。虽然 Log buffe的大小是固定的,但是可以通过不断的访问 /proc/kmsg 将所有的log都备份下来。

如下是一个例子,我们可以通过 adb shell cat /proc/kmsg 不断的将log打印到shell里面。

cat_kmsg.png

除此之外,还可以通过重定向将 Log 转存到文件中。例如,下面的命令将 kmsg buffer 的内容保存到windows D盘的 kernel_kmsg.log 文件中

D:\> adb shell cat /proc/kmsg > d:\kernel_kmsg.log

应用范围

只要 adb shell 可以连接,并且有访问 /proc/kmsg 的权限,那么就可以通过访问 /proc/kmsg 的方式来读取Kernel log。但是,这并不适用于调试 Kernel BUG,因为当 Kernel 有 BUG 的时候 adb 连接首先会断掉,会导致无法录取有效的 log 分析问题。

其适用的场合主要是跟踪调试内核的逻辑,或者监测硬件模块的内核行为等等。

由于通过 cat 或者其他应用程序读取 Log Buffer 的时候可以不断的等待新的 log,所以访问 /proc/kmsg 的方式适合长时间的录取 log,一旦有新的 log 就可以被录制下来。

使用限制

在访问 /proc/kmsg 的时候有一些限制,主要是

  1. 由于 Kernel log buffer 循环缓冲区只有一个读指针,所以当一个程序在读 buffer 的时候会不断的移动 buffer
    的读指针,这样当有多个程序读取 buffer 的时候每个程序得到的log都不是完整的。所以当访问 /proc/kmsg
    的时候务必保证没有其它程序读取 Kernel Log Buffer。
  2. /proc/kmsg 的 Owner 是 root,群组属于 System,所以在 user 版本上面是无法通过 adb shell
    读取 Kernel Log Buffer 的。安装在手机上的应用也是无法读取这个 buffer 的。

如果只是想看看当前 Log Buffer 里面的内容,而不是一直录 Log 下去,那么请参考下面的章节 "dmesg"。

按此方式并不仅仅限于 Android 系统,/proc/kmsg 是 Linux 内核标准实现的部分,所以任何采用了 Linux 内核的系统都可以用这种方式获取 Kernel Log。

0条评论

© 2024 芯缘异码. Powered by Typecho