[MTK] 深入了解Logging Tools 之 dmesg

文摘 MediaTek 2020-03-16 阅读:6760

dmesg

前面 kmsg 的章节讲述了通过 /proc/kmsg 访问 Kernel log buffer 的方式,其主要限制是不能有多读者,即不能多个程序同时访问 Kernel Log Buffer,否则每一个访问程序得到的结果都是不完整的。

但有些时候我们可能并不知道系统里面有哪些后台进程在读取 Kernel Log Buffer,这个时候我们如何获取到可信的 Kernel Log呢?

系统(Android 或者大多数 Linux 发行版)里面还有另外一个工具,dmesg。dmesg是一个二进制可执行程序,我们可以在 adb shell 执行它,例如:

adb shell dmesg

上述命令会将整个 Log Buffer 从头到尾 dump 到输出设备,然后就退出了。它不会操作读指针,它只根据写指针把从最旧的 log 到最新的 log 完完整整的输出来。所以这种方式也不会受到其它 Log Buffer 读者的影响。

dmesg 的输出与 /proc/kmsg 的输出是一致的,区别是 dmesg dump 完 Kernel Log Buffer 就直接退出了。如下是 dmesg 的输出。

dmesg.png

应用场景

dmesg 的使用场景与 /proc/kmsg 的场景是大致相同的,同样,不适合调试 Kernel BUG,当 Kernel 出现 BUG 的时候 dmesg 作为 user space 程序首先就无法正常执行了,所以没办法录取到有效的 log 来分析问题。

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

dmesg 会完完整整的 dump 一次 Kernel Log Buffer,所以不会丢失掉任何的 Log。

使用限制

使用 dmesg 来获取 Kernel Log 也有一些限制,如下:

  1. dmesg 只会一次性 dump Kernel log buffer,所以只能得到当下的 log 部分,由于 Log buffer
    的大小是有限制的,在很短的时间内就可能把旧的 Log 覆盖掉,所以有可能来不及抓到旧的部分,如果 Log 量比较大,那么能够抓到的Log 时间就很短了。所以不适合 Log 量比较大的情况,也不适合长时间跟踪内核行为。
  2. dmesg 的执行需要有 root 权限才行。所以 Android user 版本是无法使用这个工具的。

如果需要长时间录取 Log,那就需要访问 /proc/kmsg 的方式。

按此方式并不仅仅限于 Android 系统,绝大多数的 Linux 发行版都内置了这个应用程序。所以大多数采用 Linux 内核的系统都可以使用此工具。

0条评论

© 2024 芯缘异码. Powered by Typecho