目录
binder transaction faile 或者binder no vma
Binder 服务端退出,出现 binder no vma(-3)
binder Penging async no vma(-28)
binder linkTodeath 和 unlinkTodeath
binder transaction faile 或者binder no vma
binder_alloc: 19851: binder_alloc_buf failed to map pages in userspace, no vma
[225929.275249] (6)[1490:Binder:1477_1]binder_alloc: 20261: binder_alloc_buf failed to map pages in userspace, no vma
[ 208.355073] (2)[1735:.statistics.rom]binder: 1735:1735 transaction failed 29201/-28, size 108-8 line 4145
29201/-28表示return_error, return_error_param 分别为 29201 和 28
return_error --> 29201 --> BR_FAILED_REPLY
return_error_param --> 28 --> ENOSPC /* No space left on device */
kernel-4.14/include/uapi/asm-generic/errno-base.h
#define EFBIG 27 /* File too large */
#define ENOSPC 28 /* No space left on device */
可以参考链接
http://mp.weixin.qq.com/s/vykL2oMsfp0ySG-2y9dgPg
Binder 服务端退出,出现 binder no vma(-3)
system server process 退出, system server 的资源会回收, 以及打开的/dev/binder 自动close, 进而会执行 binder_vma_close --> binder_alloc_vma_close 对应的process 的 binder_alloc->vma 即会清空
<6>[50749.324579] (3)[20609:kworker/3:2]binder: release 1396:6485 transaction 57903340 in, still active
<6>[50749.324598] (3)[20609:kworker/3:2]binder: send failed reply for transaction 57903340 to 16814:5483
<6>[50749.324627] (3)[20609:kworker/3:2]binder: 57903340: from 0:0 to 0:0
<6>[50749.324634] (3)[20609:kworker/3:2]binder: total 114.866 s code 36 start 50634.458 android 2020-10-10 05:11:11.357
<6>[50749.324648] (3)[20609:kworker/3:2]binder: release 1396:6495 transaction 58022801 in, still active
<6>[50749.324654] (3)[20609:kworker/3:2]binder: send failed reply for transaction 58022801 to 16814:16814
<6>[50749.326879] (3)[16814:ssioncontroller]binder_alloc: 1396: binder_alloc_buf, no vma
<6>[50749.326896] (3)[16814:ssioncontroller]binder: 16814:16814 transaction failed 29189/-3, size 3700-8 line 3345
binder Penging async no vma(-28)
大量pending async transaction 导致系统binder 资源,如vma 用完。
binder linkTodeath 和 unlinkTodeath
Binder的两个很重要的方法 linkTodeath 和 unlinkTodeath
Binder.java 中默认空实现,BinderProxy 中具体实现。
如果服务端的Binder连接断裂 (称之为 Binder 死亡),会导致我们远程调用失败,更为关键的是如果我们不知道Binder的连接已经断裂,那么客户端的功能就会受到影响。BpBinder.linkTodeath向服务端Binder注册死亡通知,这个时候就可以重新发起连接请求从而恢复连接。声明一个IBinder.DeathRecipient对象,IBinder.DeathRecipient是一个接口,其内部只有一个binderDied,我们需要实现这个方法,当binder死亡的时候,系统就会回调binderDied方法,然后我们就可以移除之前绑定的binder代理并重新绑定远程服务。
binder log 控制
drivers\android\binder.c
static int __init binder_init(void)
1、创建deubg 文件节点
/sys/kernel/debug/binder
failed_transaction_log proc state stats transaction_log transactions
- 创建misc 设备及binderfs,/dev/binderfs
/sys/module/binder/parameters/debug_mask
echo 8191 >/sys/module/binder/parameters/debug_mask
echo 31>/sys/module/binder_alloc/parameters/debug_mask
binder 文件分析
- Stats
是binder 通讯统计信息 binder_stasts_show
BC_TRANSACTION + BC_REPLY = BR_TRANSACTION_COMPLETE + BR_DEAD_REPLY +BR_FAILED_REPLY
正常情况每个BC_TRANSACTION 对应一个BR_TRANSACTION_COMPLETE,每隔BC_REPLY 对应一个BR_TRANSACTION_COMPLETE;如果失败了,就对应BR_DEAD_REPLY 或 BR_FAILED_REPLY
proc 14350
threads: 3
requested threads: 0+1/15 //requested_threads(请求线程数) +requested_threads_started(已启动线程数) / max_threads(最大线程数)
当系统空闲时,一般来说ready_threads = requested_threads_started +BC_ENTER_LOOPER ; 当系统繁忙时ready_threads 可能为0.
- State
查看 binder_state_show
proc 10882
context binder
thread 10882: l 12 need_return 0 tr 0
thread 10883: l 12 need_return 0 tr 0
node 28095786(debugid): ub400007d4c037180 cb400007d4c03d348 pri 0:139 hs(has_strong_ref) 1 hw(has_weak_ref) 1 ls(local_strong_refs) 0 lw(local_weak_refs) 0 is(internal_strong_refs) 1 iw(引用数) 1 tr(tmp_refs) 1
proc 454 这里是跟 iw(引用数) 1 个数一一对应,也就是引用该node的进程
-------binder_node 节点debugid
-------ub400007d4c037180 node->ptr,BnXXX弱引用,
-------cb400007d4c03d348 cookie,BnXXX 的强制类型转换
ref 28095784(debugid): desc 0 node(debugid) 2 s 1 w 1 d 0000000000000000
-------该node 对其它node 的引用信息
pending async transaction
。。。。。。。