在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技巧相关推荐

  1. linux 内核调试信息在哪里,Linux kernel debug技巧----开启DEBUG选项

    Linux kernel debug技巧----开启DEBUG选项 作者:wowo 发布于:2016-11-1 19:39 分类:Linux应用技巧 kernel的source code中有很多使用p ...

  2. 最全的Pycharm debug技巧

    最全的Pycharm debug技巧: 工欲善其事,必先利其器.无论你的 IDE 是 IntelliJ IDEA.Pycharm.WebStorm.GoLang.还是PhpStorm ,调试器都是标配 ...

  3. SAP中常见的Debug技巧(02)-跳过代码执行

    原文链接:https://mp.weixin.qq.com/s/PoKws0rdjEqEEw68AZ_UTQ 大家可以关注我个人公众号,所有分享内容,会在公众号第一时间推送,且阅读排版更好. 愿大家的 ...

  4. Android - ReactNative Debug 技巧

    Android - ReactNative Debug 技巧 前言 因为旧的项目使用了 RN,在修复 Bug 的时候,很难定位问题,在 Debug 的时候花费了大量的时间.今天小结下 Debug 技巧 ...

  5. IEDA使用之debug技巧(附高级玩法)

    前言 debug作为程序员的基础技能之一,在实际项目开发的排错中非常好用. debug不仅可以让我们更快定位到问题所在,而且debug模式的使用,也让程序员更清楚地了解到代码运行背后的逻辑. 这篇文章 ...

  6. # Idea 调试 Debug 技巧

    Idea 调试 Debug 技巧 IDEA 为我们提供了很多简单且非常强大的调试功能 在需要调试的行打上断点,debugger 方式启动Idea 控制台如下 调试功能说明 Show Execution ...

  7. 做一个好管家 Linux系统管理技巧大荟萃

    做一个好管家 Linux系统管理技巧大荟萃 [上海央邦]学一送一,超值! 必读版<十一攻破RHCE6.0.OCP>安博亚威]CCIE考试通过率第一! Cisco网络技术系列讲座 试听一个月 ...

  8. 在如今的就业形势下,想要跳槽?你该把握的一个原则和两个技巧!

    不引用调查报告,不渲染悲情气氛,简单粗暴说事实,现在的就业形势是:招聘的需求减少了,应聘的人员增加了. 想一想,是不是降薪和裁员以及公司倒闭,已经实实在在地发生在了你身上或者就在你身边? 对于招聘企业 ...

  9. 高效开发:IntelliJ IDEA天天用,这些Debug技巧你都知道?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:aneasystone https://www.aneasy ...

最新文章

  1. Struts2+Spring详解
  2. cent 8.0 安装tomcat 9.0_nginx+tomcat会话保持方案探讨
  3. C++常用的系统函数
  4. pyHook pyHook3 区别_一般过去时态和现在完成时态之间到底有什么区别?通过一道语法题,帮你彻底讲清楚!...
  5. linux 下创建GRE隧道
  6. 记一次反制追踪溯本求源
  7. 自卑都是自己不踏实做事的表现
  8. 单片机基础:MCS-51单片机的硬件结构(附硬件结构框图)
  9. 吴国平:开发旅游小镇是一款养成类游戏 | 十年二十人
  10. 常用的27个Stata命令
  11. 插入法排序c语言程序,C语言之插入排序算法
  12. 快手+中科大 | 全曝光推荐数据集KuaiRec 2.0版本
  13. 访问虚拟机Linux服务打不开页面
  14. 面向对象(4)封装与继承
  15. 电脑登录密码和outlook密码不一致。密码正确却提示密码或用户不正确。
  16. matlab中计算容差是什么,相对和绝对容差定义求解
  17. 除权、除息、复权、填权、填息、贴权、贴息、含权、含息、前复权、后复权到底什么区别(MD终于明白了用图解释)
  18. php30m限制,住建部:严格控制高度超过 30 米或宽度超过 45 米的大型雕塑
  19. FP6195耐压60V电流降压3.3V5V模块供电方案
  20. 那些年玩过的超级玛丽,竟然还隐藏了强化学习的这些原理

热门文章

  1. 服务器意外重启导致storm报错的问题处理
  2. NYOJ 257 中缀表达式表示成后缀表达式
  3. windows+php+mysql+apache(wamp)安装配置问题
  4. 谷歌go语言课程讲解资源
  5. django+mysql 配置一系列问题
  6. 吴恩达 coursera AI 专项五第三课(上)总结+作业答案
  7. 吴恩达 coursera ML 第五课总结+作业答案
  8. C++类中成员变量的初始化有两种方式
  9. CUDA内存类型memory
  10. 【算法】ROI Align 原理