一个关于binder的debug技巧
在android的C/S IPC通信框架中,常会遇到binder通信异常的问题(其实不是太经常会遇到,主要在煲机和压测等极限测试的情况下才会出现),binder的driver基本不用去怀疑其出bug的可能性,基本为0,如果binder通信出现问题,那么十有八九都是app或者service本身写的有问题造成的。
这里介绍一个通过kernel的sys文件系统去debug binder的方法,我遇到的两类问题:1、binder leak 2、binder开启的线程已达上限造成后面的从上往下的call flow block住产生anr
1、binder leak就是binder内存泄漏,用于binder通信的buffer大概有4M左右(据同事描述,还没拷证具体数值),在binder通信中如果传输中使用的parcel没有有效release,会造成buffer空间越来越少,然后积累到一定程度,就会出现binder传输的消息在另外一端无法接收。
/***更正***/
在进程使用binder driver的时候,最大在kernel空间中开启的虚拟内存空间是4M。一般如果使用IPCThread的API去操作binder的时候是会自动往driver发送FREE_BUFFER的指令做释放操作,所以一般很难出现Binder leak的现象。除非是自己对binder去做IOctl。
2、binder线程到达上限。这个的情景就是app向service发起请求的频率过高,service端如果对所有的业务执行都加了锁的话,则会导致service端用于接收处理binder事件的线程全部卡住,当线程池(default 16个线程)耗尽之后,就无法再处理请求。如果这个时候app的主线程如果再调用该serivce提供的方法,就很容易出现anr
我要提的debug方法就是cat /sys/kernel/debug/binder这个目录下的文件来查看所有进程的使用binder的状况来确定是上述两种状况的哪一种,我主要是cat transactions这个文件来查看运行状况的,一般的打印如下:
proc代表进程号;一行buffer代表有一个binder通信在占用buffer的空间(具体其他打印的意义需要参考binder driver)
如果针对第一种binder leak的情况,在程序运行过程中该proc下的buffer的行数会越来越多,不停地增长,这样基本上你就能判断是binder leak的情况
另外一种状况的打印,其中有新增一类以thread开头的打印,这个代表的是进程具有的接收binder的线程,如果这类行数超多,16个,基本就可以确定是binder线程池已经满了
proc 1663 thread 1663: l 02incoming transaction 73304: ffffffc07735c580 from 2364:3836 to 1663:1663 code 9 flags 10 pri 0 r1 node 9227 size 44:0 data ffffff8005580880thread 2158: l 10outgoing transaction 73630: ffffffc097d93c00 from 1663:2158 to 2364:0 code 1 flags 10 pri 0 r1 node 23731 size 92:0 data ffffff8005c81018thread 2179: l 02incoming transaction 73390: ffffffc09a2bdf80 from 2364:3879 to 1663:2179 code 9 flags 10 pri 0 r1 node 9227 size 44:0 data ffffff8005580370thread 2968: l 01incoming transaction 73402: ffffffc0b1df1600 from 2364:3859 to 1663:2968 code 20 flags 10 pri 0 r1 node 9227 size 60:0 data ffffff8005580900thread 3328: l 01incoming transaction 73340: ffffffc0b1df1c80 from 2364:3864 to 1663:3328 code 20 flags 10 pri 0 r1 node 9227 size 60:0 data ffffff8005580160thread 3505: l 01incoming transaction 73344: ffffffc0b1acd780 from 2364:3572 to 1663:3505 code 9 flags 10 pri 0 r1 node 9227 size 44:0 data ffffff8005580270thread 3506: l 01incoming transaction 73338: ffffffc0b1df1c00 from 2364:3320 to 1663:3506 code 9 flags 10 pri 0 r1 node 9227 size 44:0 data ffffff80055800e0thread 3528: l 01incoming transaction 73642: ffffffc0b0354500 from 2364:2377 to 1663:3528 code 3 flags 10 pri 0 r1 node 23734 size 72:0 data ffffff8005580a20thread 3529: l 01incoming transaction 73343: ffffffc09b223a00 from 2364:3321 to 1663:3529 code 9 flags 10 pri 0 r1 node 9227 size 44:0 data ffffff80055801f0thread 3582: l 01incoming transaction 73644: ffffffc077b0fc00 from 2364:3516 to 1663:3582 code 3 flags 10 pri 0 r1 node 23734 size 72:0 data ffffff8005580508thread 3583: l 01incoming transaction 73307: ffffffc098e91780 from 2364:3322 to 1663:3583 code 20 flags 10 pri 0 r1 node 9227 size 60:0 data ffffff8005580628thread 3835: l 01incoming transaction 73309: ffffffc0a3c8ae80 from 2364:3566 to 1663:3835 code 20 flags 10 pri 0 r1 node 9227 size 60:0 data ffffff8005580050thread 3852: l 01incoming transaction 73411: ffffffc0b0357200 from 2364:2379 to 1663:3852 code 9 flags 10 pri 0 r1 node 9227 size 44:0 data ffffff80055803f0thread 3853: l 01incoming transaction 73629: ffffffc0779a5500 from 2364:2942 to 1663:3853 code 9 flags 10 pri 0 r1 node 9227 size 44:0 data ffffff8005580470thread 3874: l 01incoming transaction 73400: ffffffc094b5e900 from 2364:3005 to 1663:3874 code 20 flags 10 pri 0 r1 node 9227 size 60:0 data ffffff80055807f0thread 3875: l 01incoming transaction 73308: ffffffc094b19a80 from 2364:3860 to 1663:3875 code 20 flags 10 pri 0 r1 node 9227 size 60:0 data ffffff80055806d0thread 3889: l 01incoming transaction 73384: ffffffc09907ea80 from 2364:3571 to 1663:3889 code 9 flags 10 pri 0 r1 node 9227 size 44:0 data ffffff80055802f0thread 3892: l 01incoming transaction 74866: ffffffc09919be00 from 1650:1816 to 1663:3892 code 4 flags 10 pri -8 r1 node 26532 size 44:0 data ffffff80055805a0buffer 73309: ffffff8005580050 size 60:0 activebuffer 73338: ffffff80055800e0 size 44:0 activebuffer 73340: ffffff8005580160 size 60:0 activebuffer 73343: ffffff80055801f0 size 44:0 activebuffer 73344: ffffff8005580270 size 44:0 activebuffer 73384: ffffff80055802f0 size 44:0 activebuffer 73390: ffffff8005580370 size 44:0 activebuffer 73411: ffffff80055803f0 size 44:0 activebuffer 73629: ffffff8005580470 size 44:0 activebuffer 73644: ffffff8005580508 size 72:0 activebuffer 74866: ffffff80055805a0 size 44:0 activebuffer 73307: ffffff8005580628 size 60:0 activebuffer 73308: ffffff80055806d0 size 60:0 activebuffer 73400: ffffff80055807f0 size 60:0 activebuffer 73304: ffffff8005580880 size 44:0 activebuffer 73402: ffffff8005580900 size 60:0 activebuffer 43572: ffffff80055809a8 size 0:0 deliveredbuffer 73642: ffffff8005580a20 size 72:0 active
为了进一步确认是否已经占满,用debuggerd去dump该进程获得其墓碑文件,就基本能看出来线程的情况,java的binder线程名大多是binder_1~binder_A ....之类的如果满16个就能确定了;native的bin档的话,线程名没有那么明确,但这些binder线程的名字都相同,也是如果满了16也能说明是该问题。
为解决这种线程池耗尽的问题,应该从app端去限制请求的频率,设定一定的时间间隔才能保证功能正常。
原文地址: https://zhuanlan.zhihu.com/p/22645229
一个关于binder的debug技巧相关推荐
- linux 内核调试信息在哪里,Linux kernel debug技巧----开启DEBUG选项
Linux kernel debug技巧----开启DEBUG选项 作者:wowo 发布于:2016-11-1 19:39 分类:Linux应用技巧 kernel的source code中有很多使用p ...
- 最全的Pycharm debug技巧
最全的Pycharm debug技巧: 工欲善其事,必先利其器.无论你的 IDE 是 IntelliJ IDEA.Pycharm.WebStorm.GoLang.还是PhpStorm ,调试器都是标配 ...
- SAP中常见的Debug技巧(02)-跳过代码执行
原文链接:https://mp.weixin.qq.com/s/PoKws0rdjEqEEw68AZ_UTQ 大家可以关注我个人公众号,所有分享内容,会在公众号第一时间推送,且阅读排版更好. 愿大家的 ...
- Android - ReactNative Debug 技巧
Android - ReactNative Debug 技巧 前言 因为旧的项目使用了 RN,在修复 Bug 的时候,很难定位问题,在 Debug 的时候花费了大量的时间.今天小结下 Debug 技巧 ...
- IEDA使用之debug技巧(附高级玩法)
前言 debug作为程序员的基础技能之一,在实际项目开发的排错中非常好用. debug不仅可以让我们更快定位到问题所在,而且debug模式的使用,也让程序员更清楚地了解到代码运行背后的逻辑. 这篇文章 ...
- # Idea 调试 Debug 技巧
Idea 调试 Debug 技巧 IDEA 为我们提供了很多简单且非常强大的调试功能 在需要调试的行打上断点,debugger 方式启动Idea 控制台如下 调试功能说明 Show Execution ...
- 做一个好管家 Linux系统管理技巧大荟萃
做一个好管家 Linux系统管理技巧大荟萃 [上海央邦]学一送一,超值! 必读版<十一攻破RHCE6.0.OCP>安博亚威]CCIE考试通过率第一! Cisco网络技术系列讲座 试听一个月 ...
- 在如今的就业形势下,想要跳槽?你该把握的一个原则和两个技巧!
不引用调查报告,不渲染悲情气氛,简单粗暴说事实,现在的就业形势是:招聘的需求减少了,应聘的人员增加了. 想一想,是不是降薪和裁员以及公司倒闭,已经实实在在地发生在了你身上或者就在你身边? 对于招聘企业 ...
- 高效开发:IntelliJ IDEA天天用,这些Debug技巧你都知道?
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:aneasystone https://www.aneasy ...
最新文章
- Struts2+Spring详解
- cent 8.0 安装tomcat 9.0_nginx+tomcat会话保持方案探讨
- C++常用的系统函数
- pyHook pyHook3 区别_一般过去时态和现在完成时态之间到底有什么区别?通过一道语法题,帮你彻底讲清楚!...
- linux 下创建GRE隧道
- 记一次反制追踪溯本求源
- 自卑都是自己不踏实做事的表现
- 单片机基础:MCS-51单片机的硬件结构(附硬件结构框图)
- 吴国平:开发旅游小镇是一款养成类游戏 | 十年二十人
- 常用的27个Stata命令
- 插入法排序c语言程序,C语言之插入排序算法
- 快手+中科大 | 全曝光推荐数据集KuaiRec 2.0版本
- 访问虚拟机Linux服务打不开页面
- 面向对象(4)封装与继承
- 电脑登录密码和outlook密码不一致。密码正确却提示密码或用户不正确。
- matlab中计算容差是什么,相对和绝对容差定义求解
- 除权、除息、复权、填权、填息、贴权、贴息、含权、含息、前复权、后复权到底什么区别(MD终于明白了用图解释)
- php30m限制,住建部:严格控制高度超过 30 米或宽度超过 45 米的大型雕塑
- FP6195耐压60V电流降压3.3V5V模块供电方案
- 那些年玩过的超级玛丽,竟然还隐藏了强化学习的这些原理