当前位置: 首页 > news >正文

Printk打印内核日志

一、背景

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 参数的位置, 对应占位的值

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

如果缺省消息界别, 那就是 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

image.png

上述四个值的含义是:

  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打印内核日志

一、背景 Linux 内核中提供了内核日志打印的工具printk。它的使用方式C语言中的printf是类似的。接下来我们介绍一下printk的使用方式。本文以打印Binder中的日志为例&#xff0c;进行演示。 printk的方法声明和日志级别binder驱动中增加 打印代码android系统中查看日志信息 …...

界面控件DevExpress WPF 202计划发布的新功能合集

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。本文将介绍今年DevExpr…...

Spring Cloud Alibaba 微服务2,注册中心演变 + Nacos注册中心与配置中心

目录专栏导读一、什么是Nacos&#xff1f;二、注册中心演变及其设计思想1、RestTemplate调用远程服务2、通过Nginx维护服务列表&#xff08;upStream&#xff09;3、通过Nacos实现注册中心4、心跳版Nacos三、Nacos Discovery四、Nacos核心功能1、服务注册2、服务心跳3、服务同步…...

Navicat 图形化界面工具

Navicat 介绍 Navicat是一套可创建多个连接的数据库管理工具&#xff0c;用以方便管理 MySQL、Oracle、SQL Server等不同类型的数据库 目录 Navicat 介绍 Navicat 下载 Navicat 安装 Navicat 使用 Navicat连接MySQL数据库 Navicat创建数据库和表 Navicat 下载 1、点击这…...

2023年网络安全比赛--attack(新)数据包分析中职组(超详细)

一、竞赛时间 180分钟 共计3小时 任务环境说明: 1 分析attack.pcapng数据包文件,通过分析数据包attack.pcapng找出恶意用户第一次访问HTTP服务的数据包是第几号,将该号数作为Flag值提交; 2.继续查看数据包文件attack.pcapng,分析出恶意用户扫描了哪些端口,将全部的端口号…...

C语言之extern(七十)

extern同一个文件&#xff1a;修饰变量声明#include <stdio.h>int add(){extern int x,y;return x y; }int main(){printf("%d\n", add()); }int x 10; int y 20;extern文件之间&#xff1a;修饰函数声明<1>.add.cint sum(){extern int x ;extern in…...

树的前中后序的Morris遍历

目录 一.Morris遍历 1.什么是Morris遍历 2.基本思想 3.Morris遍历的优点和缺点 4.知识回顾----二叉树的线索化 二.中序Morris遍历 1.中序Morris遍历的分析 2.中序Morris遍历的思路 3.具体的代码实现 三.前序Morris遍历 1.前序Morris遍历的思路 2.具体的代码实现 四…...

到底什么是线程?线程与进程有哪些区别?

上一篇文章我们讲述了什么是进程&#xff0c;进程的基本调度 http://t.csdn.cn/ybiwThttp://t.csdn.cn/ybiwT 那么本篇文章我们将了解一下什么是线程&#xff1f;线程与进程有哪些区别&#xff1f;线程应该怎么去编程&#xff1f; 目录 http://t.csdn.cn/ybiwThttp://t.csdn…...

你真的知道如何系统高效地学习数据结构与算法吗?

文章目录前言&#xff1a;什么是数据结构&#xff1f;什么是算法&#xff1f;学习这个算法需要什么基础&#xff1f;学习的重点在什么地方&#xff1f;一些可以让你事半功倍的学习技巧1.边学边练&#xff0c;适度刷题2.多问、多思考、多互动3.打怪升级学习法4.知识需要沉淀&…...

Linux操作系统基础的常用命令

1&#xff0c;Linux简介Linux是一种自由和开放源码的操作系统&#xff0c;存在着许多不同的Linux版本&#xff0c;但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中&#xff0c;比如手机、平板电脑、路由器、台式计算机。1.1Linux介绍Linux出现于1991年&#xff0c…...

Jasypt加密库基本使用方法

目录 1 Jasypt简介... 2 基础知识回顾... 3 Jasypt基本加密器... 4 JasyptPBE加密器... 5 Jasypt池化加密器... 6 Jasypt客户端工具... 7 JasyptSpringboot基本用法... 8 JasyptSpringboot自定义加密器... 9 JasyptSprin…...

C++并发编程之五 高级线程管理

文章目录5.1.1 线程池5.1.1 线程池 在前面我们引入了线程的通信和同步手段&#xff0c;那么为什么还要引入线程池呢&#xff1f; 线程池是一种管理多个线程的技术&#xff0c;它可以减少线程的创建和销毁的开销&#xff0c;提高并发性能。线程池中有一定数量的空闲线程&#x…...

单片机——IIC协议与24C02

1、基础知识 1.1、IIC串行总线的组成及工作原理 I2C总线只有两根双向信号线。一根是数据线SDA&#xff0c;另一根是时钟线SCL。 1.2、I2C总线的数据传输 I2C总线进行数据传送时&#xff0c;时钟信号为高电平期间&#xff0c;数据线上的数据必须保持稳定&#xff0c;只有在时钟…...

案例05-将不必要的逻辑放到前端(发送调查问卷)

目录一&#xff1a;背景介绍背景二&#xff1a;思路&方案重大问题&#xff1a;解决办法优点&#xff1a;三&#xff1a;总结一&#xff1a;背景介绍 本篇博客书写的意义是警示大家不必把不必要的逻辑放到前端。 明确前后端分离的意义。 背景 下面的主要逻辑是&#xff1…...

【每日一题】——矩阵相等判定

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;每日一题 &#x1f48c;其他专栏&#xff1a; &#x1f534; 每日反刍 &#x1f7e2; 读书笔记 &#x1f7e1; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0c;缓称…...

Linux防火墙的关闭

查看防火墙的状态打开终端输入如下命令systemctl status firewalld如图所示&#xff1a;running表示防火墙目前处于打开状态输入命令进行关闭防火墙&#xff1a;systemctl stop firewalld如图所示正常的用户是没有权限的&#xff0c;需要输入管理员的密码才能够进行关闭防火墙。…...

Request和Response的概述

⭐作者介绍&#xff1a;大二本科网络工程专业在读&#xff0c;持续学习Java&#xff0c;输出优质文章⭐作者主页&#xff1a;︶ㄣ释然⭐如果觉得文章写的不错&#xff0c;欢迎点个关注&#x1f609;有写的不好的地方也欢迎指正&#xff0c;一同进步&#x1f601;Request和Respo…...

常见的Web安全漏洞:SYN攻击/CSRF/XSS

一、SYN攻击&#xff08;属于DOS攻击&#xff09; 什么情况下被动方出现SYN_RCVD状态?(flood攻击服务) 客户伪造 ip 端口&#xff0c; 向服务端发送SYN请求。完成2次握手&#xff0c;第三次服务端 等待客户端ACK确认&#xff0c;但由于客户不存在服务端一直未收到确认&#…...

【STC15单片机】 超声波模块的使用

目录 1 基于STC15F2K60S2的超声波测距代码 1.1 基本注意事项 1.1.1 跳线帽接法 1.1.2 晶振设置 1.2 板载超声波工作原理 1.2.1 原理总结 1.2.2 超声波代码思路 1.3 STC15单片机代码部分 1.3.1 定时器0&定时器1初始化 1.3.2 超声波ultrasonic.c ultrasonic.h文件配…...

SpringBoot 动态操作定时任务(启动、停止、修改执行周期)增强版

前段时间编写了一篇博客SpringBoot 动态操作定时任务&#xff08;启动、停止、修改执行周期&#xff0c;该篇博客还是帮助了很多同学。 但是该篇博客中的方法有些不足的地方&#xff1a; 只能通过前端控制器controller手动注册任务。【具体的应该是我们提前配置好我们的任务&am…...

快排函数 -- qsort函数(Quick Sort)

文章目录&#x1f50e;1.qsort函数简介&#x1f4a1;1.1.函数原型&#x1f4a1;1.2.参数含义&#x1f50e;2.比较函数介绍&#x1f50e;3.比较函数使用案例&#x1f4a1;3.1.整型数组&#x1f4a1;3.2.浮点型数组&#x1f4a1;3.3.结构体类型 - 字符串&#x1f50e;4.利用冒泡排…...

条形码和二维码

前言&#xff1a;需要的包的相关文档 1. Barcode&#xff1a;https://pypi.org/project/python-barcode/0.8.1/ 2. Qrcode&#xff1a;https://pypi.org/project/qrcode/ 3. Zbar: https://pypi.org/project/pyzbar/ 4. Opencv: https://docs.opencv.org/3.4.11/ 5. OpenC…...

大数据-学习实践-5企业级解决方案

大数据-学习实践-5企业级解决方案 (大数据系列) 文章目录大数据-学习实践-5企业级解决方案1知识点2具体内容2.1小文件问题2.1.1 SequenceFile2.1.2 MapFile2.1.3 小文件存储计算2.2数据倾斜2.3 YARN2.3.1 YARN架构2.3.2 YARN调度器2.3.2 YARN多资源队列配置和使用2.4Hadoop官方…...

破解吲哚花菁素IR-808 N3,IR-808 azide,IR-808叠氮,酯溶性染料修饰叠氮基团,相关知识

基础产品数据&#xff08;Basic Product Data&#xff09;&#xff1a;CAS号&#xff1a;N/A中文名&#xff1a;IR-808叠氮英文名&#xff1a;IR-808 N3&#xff0c;IR-808 azideIR-808结构式&#xff08;Structural&#xff09;&#xff1a;详细产品数据&#xff08;Detailed …...

面试官:MQ的好处到底有哪些?

&#x1f497;推荐阅读文章&#x1f497; &#x1f338;JavaSE系列&#x1f338;&#x1f449;1️⃣《JavaSE系列教程》&#x1f33a;MySQL系列&#x1f33a;&#x1f449;2️⃣《MySQL系列教程》&#x1f340;JavaWeb系列&#x1f340;&#x1f449;3️⃣《JavaWeb系列教程》…...

事务机制:Redis能实现ACID属性吗?

ACID特性无需多言。我们知道关系数据库比如mysql可以实现事务的ACID特性&#xff0c;begin,commit,回滚实现。 那么redis可以实现ACID吗&#xff0c;结论是不能完全保证。 首先要知道redis通过MULTI关键字开启事务&#xff0c;中间一系列操作&#xff0c;加到操作队列中并不执…...

如何在 Apinto 实现 HTTP 与 gRPC 的协议转换(上)

什么是 gRPC 像 gRPC 是由 google 开发的一个高性能、通用的开源 RPC 框架&#xff0c;主要面向移动应用开发且基于 HTTP/2 协议标准而设计&#xff0c;同时支持大多数流行的编程语言。 gRPC 基于 HTTP/2 协议传输&#xff0c;而 HTTP/2 相比 HTTP1.x &#xff0c;有以下优势:…...

3分钟看完-丄-Python自动化测试【项目实战解析】经验分享

目录&#xff1a;导读 引言 自动化测试 背景 测试团队 测试体系发展 测试平台 自动化测试现状 现状一&#xff1a; 现状二&#xff1a; 现状三&#xff1a; 现状四&#xff1a; 现状五&#xff1a; 现状六&#xff1a; 失败的背景 失败的经历 失败总结 引言 内…...

Web漏洞-命令执行和代码执行漏洞

命令执行原理就是指用户通过浏览器或其他辅助程序提交执行命令&#xff0c;由于服务器端没有针对执行函数做过滤&#xff0c;导致在没有指定绝对路径的情况下就执行命令。漏洞成因它所执行的命令会继承WebServer的权限&#xff0c;也就是说可以任意读取、修改、执行Web目录下的…...

Towards Unsupervised Text Classification Leveraging Experts and Word Embeddings

Towards Unsupervised Text Classification Leveraging Experts and Word Embeddings Abstract 该论文提出了一种无监督的方法&#xff0c;使用每个文档中相关单词之间的文本相似度以及每个类别的关键字字典将文档分为几类。所提出的方法通过人类专业知识和语言模型丰富了类别…...

c2c网站开发策划/公众号软文是什么意思

Latex基本语法的备忘录 Latex基本语法前言一、常见的数学符号1. 数学上的“**属于**”、“**不属于**”符号。2. 数学的矩阵的**转置符号**书写。3. 数学中求和公式。4.数学中字母代上标5.数字或公式上添加方框6.数学分式7.数学公式中在某些符号下添加花括号8.数学中的垂直符号…...

东莞市手机网站建设/2345浏览器网站进入

一&#xff1a;什么是Ajax? Ajax&#xff1a;异步的JavaScript和XML&#xff0c;用于完成网页局部刷新功能&#xff08;修改少量数据只用局部刷新&#xff0c;不用再整个网页重新加载&#xff09;&#xff1b; XML的作用&#xff1a;1.是用于数据传输&#xff0c;但现在都在使…...

一级a做爰片免费网站录像/关键词优化需要从哪些方面开展

题目传送门 1 /*2 二分搜索&#xff1a;式子两边取对数&#xff0c;将x提出来&#xff0c;那么另一边就是一个常数了&#xff0c;函数是&#xff1a;lnx/x。二分搜索x&#xff0c;注意要两次 3 */4 #include <cstdio>5 #include <algorithm>6 #include <cma…...

会做网站的公司/2345网址导航智能主板

工具 window10 django2.2.2 mysql5.6 django默认使用mysqlclient连接mysql&#xff0c;但是在window下直接安装mysqlclient不容易成功&#xff0c;可以使用pymysql 代替。 但使用如下方式报错&#xff1a; #settings.py import pymysql pymysql.intall_as_MySQLdb()django 3.…...

wampserver做动态网站/聚合搜索引擎入口

tong&#xff08;&#xff09;除了可以驱动蜂鸣器之外&#xff0c;还可以驱动步进电机&#xff08;测试很好用&#xff09; 一个引脚上产生一个特定频率的方波&#xff08;50%占空比&#xff09;。持续时间可以设定&#xff0c;否则波形会一直产生直到调用noTone()函数。该引脚…...

域名购买查询/seo权重优化

Algorithm 直接插入排序 算法概述&#xff1a; 把前面的数组排好序&#xff0c;后面的元素插入到排好序的数组中。 实现思路&#xff1a; 把数组分为有序和无序两部分&#xff0c;分别用下标去指向&#xff08;有序&#xff08;j&#xff09;&#xff0c; 无序&#xff08…...