一、背景

Linux 内核中提供了内核日志打印的工具printk。它的使用方式C语言中的printf是类似的。接下来我们介绍一下printk的使用方式。本文以打印Binder中的日志为例,进行演示。

  • printk的方法声明和日志级别
  • binder驱动中增加 打印代码
  • android系统中查看日志信息

二、printk方法声明

printk 官方链接

2.1 方法声明

printk(KERN_INFO "Message: %s\n", arg);
  • KERN_INFO 的位置代表的是 要打印的消息级别
  • printk 的第一个参数 KERN_INFO "Message: %s\n" 整体是一个,格式化字符串
  • arg 参数的位置, 对应占位的值

具体的消息级别有如下集中:

如果缺省消息界别, 那就是 KERN_DEFAULT. 具体定义见 include/linux/kern_levels.h

#define KERN_EMERG      KERN_SOH "0"    /* system is unusable */
#define KERN_ALERT      KERN_SOH "1"    /* action must be taken immediately */
#define KERN_CRIT       KERN_SOH "2"    /* critical conditions */
#define KERN_ERR        KERN_SOH "3"    /* error conditions */
#define KERN_WARNING    KERN_SOH "4"    /* warning conditions */
#define KERN_NOTICE     KERN_SOH "5"    /* normal but significant condition */
#define KERN_INFO       KERN_SOH "6"    /* informational */
#define KERN_DEBUG      KERN_SOH "7"    /* debug-level messages */#define KERN_DEFAULT    KERN_SOH "d"    /* the default kernel loglevel */

2.2 配置可打印消息级别

printk函数所打印的消息,可以通过cat /dev/kmsg 命令试试查看 或者通过 dmesg 命令查看历史消息。 但是要注意的是 ”并不是所有的级别的消息“ 都会进行输出。这是因为它有一个控制开关:/proc/sys/kernel/printk

上述四个值的含义是:

  1. 当前可以消息级别
  2. 默认的消息级别
  3. 最小消息级别
  4. Boot启动时默认消息级别

因此,我们可以通过控制该文件的值,来管控消息

  • echo 0 > /proc/sys/kernel/printk 打开消息打印
  • echo 0 1 4 7 > /proc/sys/kernel/printk 来关消息打印

三、binder驱动中增加 打印代码

我们打印一下Android系统binder驱动的读写日志:

static int binder_thread_write(struct binder_proc *proc,
struct binder_thread *thread,
binder_uintptr_t binder_buffer, size_t size,
binder_size_t *consumed)
{while (ptr < end && thread->return_error.cmd == BR_OK) {int ret;if (get_user(cmd, (uint32_t __user *)ptr))return -EFAULT;ptr += sizeof(uint32_t);trace_binder_command(cmd);if (_IOC_NR(cmd) < ARRAY_SIZE(binder_stats.bc)) {atomic_inc(&binder_stats.bc[_IOC_NR(cmd)]);atomic_inc(&proc->stats.bc[_IOC_NR(cmd)]);atomic_inc(&thread->stats.bc[_IOC_NR(cmd)]);}/*print info : proc.name , proc.id , proc.thread_id, cmd name*/printk("%s (%d, %d), %s %s \n" , proc->tsk->comm, proc->pid , thread->pid,__FUNCTION__ , binder_cmd_name(cmd) );switch(cmd){....}...
}

读取binder数据时,进行消息打印:
打印消息的时机是针对每一个put_user进行消息打印。

static int binder_thread_read(struct binder_proc *proc,struct binder_thread *thread,binder_uintptr_t binder_buffer, size_t size,binder_size_t *consumed, int non_block)
{void __user *buffer = (void __user *)(uintptr_t)binder_buffer;void __user *ptr = buffer + *consumed;void __user *end = buffer + size;int ret = 0;int wait_for_proc_work;if (*consumed == 0) {printk("%s (%d, %d), %s %s \n" , proc->tsk->comm, proc->pid , thread->pid,__FUNCTION__ , binder_cmd_name(BR_NOOP) );if (put_user(BR_NOOP, (uint32_t __user *)ptr))return -EFAULT;ptr += sizeof(uint32_t);}

四、Android系统查看消息

4.1 编译内核

./build/build.sh

将输出的Image.lz4-dtb文件,进行烧录

adb reboot bootloader fastboot boot Image.lz4-dtb  //刷入新的镜像文件

4.2 查看消息

4.2.1 查看历史消息

# dmesg
[  315.979119] surfaceflinger (502, 1326), binder_thread_write BC_FREE_BUFFER
[  315.979142] surfaceflinger (502, 1326), binder_thread_read BR_NOOP
[  315.995940] ndroid.systemui (1463, 1463), binder_thread_write BC_TRANSACTION
[  315.996057] ndroid.systemui (1463, 1463), binder_thread_read BR_NOOP
[  315.996070] ndroid.systemui (1463, 1463), binder_thread_read BR_TRANSACTION_COMPLETE
[  315.996569] surfaceflinger (502, 1326), binder_thread_write BC_FREE_BUFFER
[  315.996599] surfaceflinger (502, 1326), binder_thread_read BR_NOOP

4.2.2 实时查看消息

# cat /dev/kmsg

由于系统在运行时 一定会有binder ipc , 因此消息比较多,建议个 grep联用,或者使用更分明的日志级别。

五、写在最后

所遇问题记录:

  1. 在进行 ./build/build.sh 编译时,报错需要执行’make proper’ , 这个命令的执行要到源码的根目录下去执行。

Printk打印内核日志相关推荐

  1. 永久linux修改内核打印级别,终端下更改printk打印级别

    如何去更改printk的打印级别? 1.查看当前控制台的打印级别 # cat /proc/sys/kernel/printk 该文件有4个数字值,它们根据日志记录消息的重要性,定义将其发送到何处,上面 ...

  2. Linux内核之 printk 打印

    Linux内核之 printk 打印 前言 一.printk 介绍 1. printk 消息级别 2.内核 printk 文件 二.调整打印级别 1.在 menuconfig 中修改 2.在系统中修改 ...

  3. linux设置printk打印级别,内核printk打印等级

    为了确认内核打印等级以及prink 参数对打印的分级,在led驱动初始化代码[以及exit出口]加入如下代码. 每次insmod .rmmod led模块时,根据打印等级的设置,得到不同的打印结果: ...

  4. 关闭内核printk打印

    关闭内核printk打印 有时候我们在应用层调试程序的时候想暂时屏蔽掉内核的无用打印,可以用以下方法暂时关闭 echo 0 > /proc/sys/kernel/printk

  5. linux 内核日志等级,Linux系统中日志级别详情

    日志信息分类 1.等级由低到高:debug 2.区别: debug 级别最低,可以随意的使用于任何觉得有利于在调试时更详细的了解系统运行状态的东东: info  重要,输出信息:用来反馈系统的当前状态 ...

  6. 更改printk打印级别【转】

    本文转载自:http://blog.csdn.net/weed_hz/article/details/8949140 1.查看当前控制台的打印级别  cat /proc/sys/kernel/prin ...

  7. 终端下更改printk打印级别

    如何去更改printk的打印级别? (1)查看当前控制台的打印级别 # cat /proc/sys/kernel/printk 该文件有4个数字值,它们根据日志记录消息的重要性,定义将其发送到何处,上 ...

  8. linux设置printk打印级别,printk打印等级

    cat /proc/sys/kernel/printk可以查询当前系统printk打印信息. zynq> cat printk 7       4       1       7 这四个数字分别 ...

  9. 6.内核日志级别与dmesg

    转载! 前几天,我在想printk中到底是哪些信息会打印到console上,哪些东西可以通过dmesg来查看.参考了网上一些资料以及自己做的一些实验,总结一下Linux中的console loglev ...

最新文章

  1. Open×××以及其它IP层×××的完全链路层处理的实现
  2. Android中的PopupWindow详解
  3. fatal error C1083: 无法打开预编译头文件:“Debug\opencv.pch”: No such file or directory
  4. [Python人工智能] 五.theano实现神经网络正规化Regularization处理
  5. python合法标识符_python_判断标识符的合法性
  6. postgresql 分区视图_PostgreSQL架构集中式到分布式主流架构总结
  7. Java 装箱和拆箱
  8. lua——alien库实现lua调用C动态链接库(dll、so)
  9. python基础教程是什么-Python基础教程_Python入门知识
  10. oracle中-1002,安装Oracle RAC时, 碰到到了PRKC-1002错误
  11. linux 环境变量和shell变量
  12. 2000/XP系统蓝屏原因与解决
  13. iOS多线程之5.GCD的基本使用
  14. 数字逻辑课程设计--电子闹钟
  15. ArcGIS地理配准(Georeferencing)详解
  16. 地理位置数据存储方案——Redis GEO
  17. 计算机专业surface pro,微软Surface Pro 7详细评测:仍旧是最好的二合一平板电脑
  18. win10下的VMware还原网络设置,无法创建VMware网络适配器解决办法
  19. 有关c基础指针需要注意的几个点!
  20. 『杭电1859』最小长方形

热门文章

  1. 国外博士后申请心得,博后位置,CV,电话面试面经,签证等
  2. CSS3 filter(滤镜) 百度汶川地震页面的使用
  3. xshell用rz上传文件,彻底解决乱码
  4. PTA 7-23 求序列立方和
  5. excel数据导入mysql被截取_Excel导入数据库时出现的文本截断问题解决方案
  6. 别再问我“输入URL到页面呈现”啦
  7. 思科路由器dhcp服务器配置
  8. 三、使用Arduino控制WS2812B灯
  9. 自学电脑专业技术可以考证吗
  10. git【--ours】及【--theirs】优雅的解决冲突