安卓binder驱动内核日志调试打印开放及原理(第一节)

背景:

经常有学员朋友在做系统开发时候,有时候遇到binder相关的一些问题,这个时候可能就需要比较多的binder相关日志,但是正常情况下这些binder通讯的的内核日志都是没有的打印的,因为经常binder通讯太过于频繁,如果正常版本都开放出来这些binder调试日志,那样会让系统卡顿,影响性能。
但是在分析binder驱动源码时候又可以看到类似如下日志:
在这里插入图片描述那么到底该怎么让这些日志可以打印出来呢?下面给大家介绍一下相关的打开日志的命令。
这里binder内核日志相关准备分为两节给大家分享:
第一节:主要介绍相关实战命令的使用让大家学会用命令去开放日志
第二节:主要介绍binder调试日志相关的源码分析和控制原理

实战调试命令:

通过控制debug_mask值来控制相关的binder调试日志的打开,那么debug_mask值的依据是什么呢?那就是来源下面这个枚举:
kernel-aosp14/common/drivers/android/binder.c

enum {
	BINDER_DEBUG_USER_ERROR             = 1U << 0, // 1
	BINDER_DEBUG_FAILED_TRANSACTION     = 1U << 1, // 2
	BINDER_DEBUG_DEAD_TRANSACTION       = 1U << 2, // 4
	BINDER_DEBUG_OPEN_CLOSE             = 1U << 3, // 8
	BINDER_DEBUG_DEAD_BINDER            = 1U << 4, // 16
	BINDER_DEBUG_DEATH_NOTIFICATION     = 1U << 5, // 32
	BINDER_DEBUG_READ_WRITE             = 1U << 6, // 64
	BINDER_DEBUG_USER_REFS              = 1U << 7, // 128
	BINDER_DEBUG_THREADS                = 1U << 8, // 216
	BINDER_DEBUG_TRANSACTION            = 1U << 9, // 512
	BINDER_DEBUG_TRANSACTION_COMPLETE   = 1U << 10,// 1024
	BINDER_DEBUG_FREE_BUFFER            = 1U << 11,// 2048
	BINDER_DEBUG_INTERNAL_REFS          = 1U << 12,// 4096
	BINDER_DEBUG_PRIORITY_CAP           = 1U << 13,// 8192
	BINDER_DEBUG_SPINLOCKS              = 1U << 14,// 16384
};

比如上面背景中我们看到有binder_debug打印,它带的参数是BINDER_DEBUG_OPEN_CLOSE
在这里插入图片描述
那么从枚举得出BINDER_DEBUG_OPEN_CLOSE = 1U << 3, // 8
所以只需要对debug_mask写入 8既可以实现让binder的中所有BINDER_DEBUG_OPEN_CLOSE相关binder_debug打印出来。

那么这个debug_mask在哪里呢?这里先直接告诉大家,是在如下目录:

NX563J:/sys/module/binder/parameters # ls
debug_mask  devices  stop_on_user_error

简单说就是在/sys/module/binder/parameters/debug_mask,这里的debug_mask文件就是要写入的文件
比如写入上面的值BINDER_DEBUG_OPEN_CLOSE为8 (注意一般需要debug机器)

NX563J:/ # echo 8 >  /sys/module/binder/parameters/debug_mask                                                                                                                                                  

然后这个时候抓取日志看看是否有显示binder的open相关日志:

130|NX563J:/ # logcat -b all -c;logcat -b kernel | grep binder                                                                                                                                                    




03-04 00:33:46.170     0     0 I binder  : 30418 close vm area da398000-da496000 (1016 K) vma 10220051 pagep 60000000000f53
03-04 00:33:46.172     0     0 I binder  : binder_flush: 30418 woke 0 threads
03-04 00:33:46.172     0     0 I binder  : binder_deferred_release: 30418 threads 5, nodes 2 (ref 3), refs 8, active transactions 0
03-04 00:33:46.187     0     0 I binder  : 30385 close vm area 75d915f000-75d925d000 (1016 K) vma 10220051 pagep 60000000000f53
03-04 00:33:46.187     0     0 I binder  : 30385 close vm area 765da4f000-765db4d000 (1016 K) vma 10220051 pagep 60000000000f53
03-04 00:33:46.187     0     0 I binder  : binder_flush: 30385 woke 0 threads
03-04 00:33:46.187     0     0 I binder  : binder_flush: 30385 woke 0 threads
03-04 00:33:46.188     0     0 I binder  : binder_deferred_release: 30385 threads 1, nodes 0 (ref 0), refs 3, active transactions 0
03-04 00:33:46.195     0     0 I binder  : binder_deferred_release: 30385 threads 11, nodes 50 (ref 51), refs 53, active transactions 0
03-04 00:33:47.224     0     0 I binder  : binder_open: 30512:30512
03-04 00:33:47.224     0     0 I binder  : 30512:30512 ioctl 40046210 7fd05b5cc0 returned -22
03-04 00:33:47.224     0     0 I binder  : binder_mmap: 30512 765db5c000-765dc5a000 (1016 K) vma 200071 pagep 60000000000f53
03-04 00:33:47.499     0     0 I binder  : binder_open: 30512:30536
03-04 00:33:47.499     0     0 I binder  : 30512:30536 ioctl 40046210 765d23af04 returned -22
03-04 00:33:47.499     0     0 I binder  : binder_mmap: 30512 75f1646000-75f1744000 (1016 K) vma 200071 pagep 60000000000f53
03-04 00:33:53.466     0     0 I binder  : binder_open: 30556:30556
03-04 00:33:53.466     0     0 I binder  : 30556:30556 ioctl 40046210 7fd05b5cc0 returned -22
03-04 00:33:53.466     0     0 I binder  : binder_mmap: 30556 765db56000-765dc54000 (1016 K) vma 200071 pagep 60000000000f53
03-04 00:33:53.619     0     0 I binder  : binder_open: 30556:30579
03-04 00:33:53.619     0     0 I binder  : 30556:30579 ioctl 40046210 765d23af04 returned -22
03-04 00:33:53.619     0     0 I binder  : binder_mmap: 30556 765cfa9000-765d0a7000 (1016 K) vma 200071 pagep 60000000000f53

明显可以看到open,closer日志

如果想要多个开放多个枚举,那么只需要做或运算,然后最后结果写入 debug_mask既可以
比如开放如下几个枚举:

BINDER_DEBUG_USER_ERROR             = 1U << 0, // 1
BINDER_DEBUG_FAILED_TRANSACTION     = 1U << 1, // 2
BINDER_DEBUG_DEAD_TRANSACTION       = 1U << 2, // 4
BINDER_DEBUG_OPEN_CLOSE             = 1U << 3, // 8

那么最后写入的值就是8 + 4+ 2+ 1 = 15

NX563J:/ # echo 15 >  /sys/module/binder/parameters/debug_mask                                                                                                                                                  

和binder相关的/sys/module/还有一个binder_alloc,它主要是binder 申请相关的日志,这里枚举有差异

kernel-aosp14/common/drivers/android/binder_alloc.c

enum {
	BINDER_DEBUG_USER_ERROR             = 1U << 0, // 1
	BINDER_DEBUG_OPEN_CLOSE             = 1U << 1, // 2
	BINDER_DEBUG_BUFFER_ALLOC           = 1U << 2, // 4
	BINDER_DEBUG_BUFFER_ALLOC_ASYNC     = 1U << 3, // 8
};

这里写入值方式和binder下面节点一样

NX563J:/ # echo 7 >  /sys/module/binder_alloc/parameters/debug_mask                                                                                                                                                  

写完后可以看到日志有大量的alloc相关打印:

03-04 00:42:12.716     0     0 I binder_alloc: 15501: binder_alloc_buf size 128 got buffer 0000000000000000 size 1040384
03-04 00:42:12.716     0     0 I binder_alloc: 15501: allocate pages 0000000000000000-0000000000000000
03-04 00:42:12.716     0     0 I binder_alloc: 15501: add free buffer, size 1040256, at 0000000000000000
03-04 00:42:12.716     0     0 I binder_alloc: 15501: binder_alloc_buf size 128 got 0000000000000000
03-04 00:42:12.717     0     0 I binder_alloc: 15501: binder_free_buf 0000000000000000 size 128 buffer_size 128
03-04 00:42:12.717     0     0 I binder_alloc: 15501: free pages 0000000000000000-0000000000000000
03-04 00:42:12.717     0     0 I binder_alloc: 15501: merge free, buffer 0000000000000000 do not share page with 0000000000000000 or 0000000000000000
03-04 00:42:12.717     0     0 I binder_alloc: 15501: free pages 0000000000000000-0000000000000000
03-04 00:42:12.717     0     0 I binder_alloc: 15501: add free buffer, size 1040384, at 0000000000000000
03-04 00:42:12.717     0     0 I binder_alloc: 15733: binder_alloc_buf size 9648 got buffer 0000000000000000 size 1040384
03-04 00:42:12.717     0     0 I binder_alloc: 15733: allocate pages 0000000000000000-0000000000000000
03-04 00:42:12.717     0     0 I binder_alloc: 15733: add free buffer, size 1030736, at 0000000000000000
03-04 00:42:12.717     0     0 I binder_alloc: 15733: binder_alloc_buf size 9648 got 0000000000000000
03-04 00:42:12.717     0     0 I binder_alloc: 15733: binder_free_buf 0000000000000000 size 9648 buffer_size 9648
03-04 00:42:12.717     0     0 I binder_alloc: 15733: free pages 0000000000000000-0000000000000000
03-04 00:42:12.717     0     0 I binder_alloc: 15733: merge free, buffer 0000000000000000 do not share page with 0000000000000000 or 0000000000000000
03-04 00:42:12.717     0     0 I binder_alloc: 15733: free pages 0000000000000000-0000000000000000
03-04 00:42:12.717     0     0 I binder_alloc: 15733: add free buffer, size 1040384, at 0000000000000000
03-04 00:42:12.963     0     0 I binder_alloc: 15501: binder_alloc_buf size 304 got buffer 0000000000000000 size 304
03-04 00:42:12.963     0     0 I binder_alloc: 15501: allocate pages 0000000000000000-0000000000000000
03-04 00:42:12.963     0     0 I binder_alloc: 15501: binder_alloc_buf size 304 got 0000000000000000
03-04 00:42:12.963     0     0 I binder_alloc: 1114: binder_free_buf 0000000000000000 size 48 buffer_size 48
03-04 00:42:12.963     0     0 I binder_alloc: 1114: free pages 0000000000000000-0000000000000000
03-04 00:42:12.963     0     0 I binder_alloc: 1114: merge free, buffer 0000000000000000 do not share page with 0000000000000000 or 0000000000000000
03-04 00:42:12.963     0     0 I binder_alloc: 1114: free pages 0000000000000000-0000000000000000
03-04 00:42:12.963     0     0 I binder_alloc: 1114: add free buffer, size 1040384, at 0000000000000000
03-04 00:42:12.964     0     0 I binder_alloc: 15501: binder_free_buf 0000000000000000 size 304 buffer_size 304
03-04 00:42:12.964     0     0 I binder_alloc: 15501: free pages 0000000000000000-0000000000000000
03-04 00:42:12.964     0     0 I binder_alloc: 15501: add free buffer, size 304, at 0000000000000000
03-04 00:42:12.964     0     0 I binder_alloc: 1114: binder_alloc_buf size 48 got buffer 0000000000000000 size 1040384
03-04 00:42:12.964     0     0 I binder_alloc: 1114: allocate pages 0000000000000000-0000000000000000
03-04 00:42:12.964     0     0 I binder_alloc: 1114: add free buffer, size 1040336, at 0000000000000000
03-04 00:42:12.964     0     0 I binder_alloc: 1114: binder_alloc_buf size 48 got 0000000000000000

更多framework实战开发,请关注下面“千里马学框架”

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/981585.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uniapp 常用 UI 组件库

1. uView UI 特点&#xff1a; 组件丰富&#xff1a;提供覆盖按钮、表单、图标、表格、导航、图表等场景的内置组件。跨平台支持&#xff1a;兼容 App、H5、小程序等多端。高度可定制&#xff1a;支持主题定制&#xff0c;组件样式灵活。实用工具类&#xff1a;提供时间、数组操…

Gpt翻译完整版

上一篇文章收到了很多小伙伴的反馈&#xff0c;总结了一下主要以下几点&#xff1a; 1. 说不知道怎么调api 2. 目前只是把所有的中文变成了英文&#xff0c;如果想要做多语言还需要把这些关键字提炼出来成放到message_zh.properties和message_en.properties文件中&#xff0c…

【MATLAB例程】三维下的IMM(交互式多模型),模型使用CV(匀速)、CT(匀速转弯)和CA(匀加速),滤波使用EKF。附完整代码

本文介绍一个三维IMM(Interacting Multiple Model)算法,该算法用于目标跟踪,结合了不同运动模型(匀速、匀加速和转弯)。代码使用MATLAB编写,包含仿真、模型预测和结果可视化。订阅专栏后,可直接获得完整代码 文章目录 运行结果完整代码代码解析1. 初始化环境2. 仿真参数…

未来经济范式争夺战:AR眼镜为何成为下一代交互终端的制高点?

未来经济范式争夺战&#xff1a;AR眼镜为何成为下一代交互终端的制高点&#xff1f; 在蒸汽机轰鸣的工业革命时代&#xff0c;煤炭、铁路、电报构建了第一个现代经济范式&#xff1b;互联网时代&#xff0c;电力、光纤、物流网络重构了全球经济版图。当前&#xff0c;我们正站…

【Python爬虫】爬取公共交通路网数据

程序来自于Github&#xff0c;以下这篇博客作为完整的学习记录&#xff0c;也callback上一篇爬取公共交通站点的博文。 Bardbo/get_bus_lines_and_stations_data_from_gaode: 这个项目是基于高德开放平台和公交网获取公交线路及站点数据&#xff0c;并生成shp文件&#xff0c;…

如何将飞书多维表格与DeepSeek R1结合使用:效率提升的完美搭档

将飞书的多维表格与DeepSeek R1结合使用&#xff0c;就像为你的数据管理和分析之旅装上一台涡轮增压器。两者的合作&#xff0c;不仅仅在速度上让人耳目一新&#xff0c;更是将智能化分析带入了日常的工作场景。以下是它们如何相辅相成并改变我们工作方式的一些分享。 --- 在…

一周学会Flask3 Python Web开发-在模板中渲染WTForms表单视图函数里获取表单数据

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 为了能够在模板中渲染表单&#xff0c;我们需要把表单类实例传入模板。首先在视图函数里实例化表单类LoginForm&#xff0c;然…

阿里通义万相2.1模型在亚马逊云科技ECS容器中的私有化部署

本文将主要介绍同义万相v2.1视频生成模型的在AWS上部署的初步测试 通义万相AI模型介绍 通义万相模型是阿里云负责大规模生成式模型的团队&#xff0c;最近发布了通义万相2.1(以下称Wan 2.1)&#xff0c;这是一个“全面开源的视频基础模型套件&#xff0c;突破了视频生成的边界…

苍穹外卖-阿里云OSS文件上传

苍穹外卖-阿里云OSS文件上传 一、阿里云OSS简介**获取AccessKey**获取enpoint 二、代码实现1 引入依赖2 定义OSS相关配置2.1 application-dev.yml2.2 application.yml 3 读取OSS配置3.1 AliOssProperties 4 生成OSS工具类对象4.1 AliOssUtil4.2 OssConfiguration2.5 CommonCont…

8.路由原理专题

路由器数据转发原理&#xff0c;路由表、FIB、快速转发表的关系 路由的控制平面与转发平面 控制平面:负责路由计算,维护;路由协议运行在控制平面 转发平面:进行数据包的封装,报文转发,路由表,FIB表,快速转发表等 控制平面与转发平面相互独立又协同工作 路由器检查数据包的目…

详细分析KeepAlive的基本知识 并缓存路由(附Demo)

目录 前言1. 基本知识2. Demo2.1 基本2.2 拓展2.3 终极 3. 实战 前言 &#x1f91f; 找工作&#xff0c;来万码优才&#xff1a;&#x1f449; #小程序://万码优才/r6rqmzDaXpYkJZF 基本知识推荐阅读&#xff1a;KeepAlive知识点 从实战中学习&#xff0c;源自实战中vue路由的…

Free Auto Clicker - 在任意位置自动重复鼠标点击

“想让鼠标自己动起来&#xff0c;解放双手去做更有趣的事&#xff1f;”Free Auto Clicker 就像你的数字小助手&#xff0c;能在任意位置自动重复点击鼠标。从玩游戏到刷网页&#xff0c;这款免费工具让你告别枯燥的重复操作&#xff0c;效率瞬间起飞&#xff01; 你有没有想…

【人工智能】GPT-4 vs DeepSeek-R1:谁主导了2025年的AI技术竞争?

前言 2025年&#xff0c;人工智能技术将迎来更加激烈的竞争。随着OpenAI的GPT-4和中国初创公司DeepSeek的DeepSeek-R1在全球范围内崭露头角&#xff0c;AI技术的竞争格局开始发生变化。这篇文章将详细对比这两款AI模型&#xff0c;从技术背景、应用领域、性能、成本效益等多个方…

蓝桥杯第15届真题解析

由硬件框图可以知道我们要配置LED 和按键、lcd&#xff0c;解决lcd引脚冲突 LED 先配置LED的八个引脚为GPIO_OutPut&#xff0c;锁存器PD2也是&#xff0c;然后都设置为起始高电平&#xff0c;生成代码时还要去解决引脚冲突问题 按键 按键配置&#xff0c;由原理图按键所对引…

51c自动驾驶~合集22

我自己的原文哦~ https://blog.51cto.com/whaosoft/11870502 #自动驾驶数据闭环最前沿论文 近几年&#xff0c;自动驾驶技术的发展日新月异。从ECCV 2020的NeRF问世再到SIGGRAPH 2023的3DGS&#xff0c;三维重建走上了快速发展的道路&#xff01;再到自动驾驶端到端技术的…

【Python】——使用python实现GUI图书管理系统:Tkinter+SQLite实战

本文将通过一个完整的python项目——图书管理系统&#xff0c;演示如何利用Tkinter构建GUI 界面&#xff0c;结合SQLite数据库实现增删改查功能。代码简洁易懂&#xff0c;适合python初学者学习和二次开发。 一、项目功能概览 图书管理&#xff1a;添加、查看、修改、删除图书…

Docker创建自定义网桥并指定网段

前言 docker0是Docker默认网络的核心组件, 通过虚拟网桥和NAT技术, 实现了容器间的通信以及容器与外部网络的交互。然而, docker0网段是固定的(通常是172.17.0.0/16), 为了更灵活地管理容器网络&#xff0c;Docker支持创建自定义网桥&#xff0c;允许用户指定网段。 例如, 在…

Spring Boot集成Spring Ai框架【详解 搭建Spring Ai项目,以及简单的ai大模型智能体应用,附有图文+示例代码】

文章目录 一.Spring Ai介绍1.0 认识Spring Ai1.1 特征1.1 大模型专业名字介绍1.1.1 RAG(检索增强生成)RAG 的基本原理RAG 的关键技术RAG 的优势RAG 的应用场景 1.1.2 fine-tuning(微调)1.1.3 function-call(函数调用) 1.2 创建简单的Spring Ai项目 二.Spring Ai简单的智能应用2…

51c自动驾驶~合集53

我自己的原文哦~ https://blog.51cto.com/whaosoft/13431196 #DriveTransformer 上交提出&#xff1a;以Decoder为核心的大一统架构写在前面 & 笔者的个人理解 当前端到端自动驾驶架构的串行设计导致训练稳定性问题&#xff0c;而且高度依赖于BEV&#xff0c;严重限…

【C语言】联合体 `union` 的妙用

C 语言联合体的妙用:结合 . 和 -> 操作符与 typedef 的深入剖析 在 C 语言中,联合体(union)是一种独特的复合数据类型,因其内存共享特性而在内存优化、类型切换和底层操作中展现出妙用。与结构体(struct)不同,联合体允许同一块内存存储不同类型的数据,提供高效且灵…