binder 问题集锦

目录

binder transaction faile 或者binder no vma 

Binder 服务端退出,出现 binder no vma(-3)

binder Penging async no vma(-28)

binder linkTodeath 和 unlinkTodeath

binder log 控制

binder 文件分析


 

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

  1. 创建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

。。。。。。。

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
binder_open是Binder机制中的一个函数,用于打开Binder驱动并返回一个Binder状态结构体。在该函数中,会调用copy_from_user函数从用户空间获取一个struct binder_write_read结构体,并将其作为参数传递给binder_thread_write和binder_thread_read函数。\[1\] 在Binder机制的Native层实现中,binder_open函数被用于开启Binder,并将自身注册为Binder进程的上下文,然后通过调用binder_loop函数来启动Binder循环。\[2\] 在binder_loop函数中,如果收到了Binder的读写消息信息,会调用binder_parse函数进行处理。binder_parse函数会将读取到的消息进行解析,并调用相应的处理函数进行处理。\[3\] #### 引用[.reference_title] - *1* [05.Binder系统:第6课第2节_Binder系统_驱动情景分析_打印数据交互过](https://blog.csdn.net/weixin_43013761/article/details/88171380)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [【Binder 机制】Native 层 Binder 机制分析 ( binder_loop | svcmgr_handler | binder.c | binder_parse )](https://blog.csdn.net/han1202012/article/details/120345228)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值