如何打印Android的kernel log

linux 内核printk机制

Android内核是基于Linxu kernel的,因此其log机制也是通用的,在Android内核中使用printk函数进行Log输出。与c语言的printf类似,printk提供格式化输入功能,同时,它也具有所有LOG机制的特点--提供日志级别过虑功能。printk提供了8种日志级别(详细的定义在include/linux/kern_levels.h中).
 
最简单的打印kernel log的方式,直接在你想要打印log的kernel文件中加入如下语句
printk(KERN_ALERT "This is the log for Android kernel, in function %s", __func__)

 

获得kernel输出的log

可以用dmesg和kmsg,区别是:

dmesg是从kernel的ring buffer(环缓冲区)中读取信息的,可以用dmesg 来显示ring buffer内容,还可以用dmesg >xxx.txt 把ring buffer的内容保存为文件,但是如果ring buffer有可能刷新了或者满了有些信息会漏掉,而且dmesg不能实时打印系统发生了什么,这个时候就需要kmsg

$ dmesg -w可以实时查看日志信息
$ dmesg -w >log.txt 可以把实时的打印放到log.txt中
$ dmesg -C 可以清除ringbuf的内容

最简单的输出android kernel log用如下命令,输出到屏幕的同时,保存到android_kernel.log文件中:

$ adb shell dmesg |tee android_kernel.log

 

如果要使用kmesg: /proc/kmsg是专门输出内核信息的地方,为了能够方便的在 user space 读取 Kernel log,Kernel driver 里面将ring buffer映射到了 /proc 目录下的文件节点 /proc/kmsg。所以读取 /proc/kmsg 文件其实就是在访问 Kernel Log 的循环缓冲区。虽然 Log buffe的大小是固定的,但是可以通过不断的访问 /proc/kmsg 将所有的log都备份下来。

$ adb shell cat /proc/kmsg |tee android_kmsg.log

#实时显示内核打印信息并保存到android_kmsg.log文件中

 

参考链接:

https://www.pianshen.com/article/1034665762/

https://blog.csdn.net/Wang20122013/article/details/108446180

https://blog.csdn.net/wwwlyj123321/article/details/88422640

posted @ 2022-12-05 16:53  青山牧云人  阅读(2305)  评论(0编辑  收藏  举报