如何根据binder client端查找binder server端?

当遇到SWT问题时,分析binder通信是关键。通过 SYS_BINDER_INFO 和 SWT_JBT_TRACES 文件,利用'outgoing transaction'关键字找到binder client与server间的交互。如果常规方法无效,可在kernel_log中查找binder release日志,通过debug_id定位对端信息。若server端显示为670:0或0:0,分别表示无空闲binder或进程已挂掉,需进一步调查binder server状态。

发生SWT时,backtrace经常会卡在binder client端等待binder server端返回:

IPCThreadState::waitForResponse-->IPCThreadState::talkWithDriver

需要找到server端的pid才能进行下一步分析

方法一:常规方法

根据binder client thread的sysTid在SYS_BINDER_INFO/SWT_JBT_TRACES中查找binder通信对端,关键字“outgoing transaction”:

SYS_BINDER_INFO / SWT_JBT_TRACES中可以查看binder信息

在这里插入图片描述
Outgoing: Current thread is performing binder request to other process
Incoming: Current thread is performing binder service for other process

方法二:如果在SYS_BINDER_INFO中无法找到binder对端信息怎么办?

可以尝试在kernel_log中查找binder release的log(binder所在进程结束时会调用),找到
debug_id再进行下一步定位,例如:
kernel_log
[ 543.692215] .(6)[6750:kworker/6:1]binder: release 1035:1035 transaction 257798 out, still active
debug_id是257798,之后根据debug_id对应查找SYS_BINDER_INFO可以找到对端信息:

//SYS_BINDER_INFO:
//此处可以看到binder server端是670:0, 与binder server端通信的是1035进程
proc 670
context binder
thread 670: l 12 need_return 0 tr 0
outgoing transaction 261951: 0000000000000000 from 670:670 to 1035:0 code 1 flags 10 pri 0:120 r1 start
467.941511 android 2019-08-07 13:52:51.231
incoming transaction 256020: 0000000000000000 from 8297:8404 to 670:670 code 17 flags 10 pri 0:120 r1
start 462.911897 android 2019-08-07 13:52:46.201 node 1053 size 496:0 data 0000000000000000
……
pending transaction 257798: 0000000000000000 from 1035:1035 to 670:0 code 5 flags 10 pri 0:118 r1 start
463.595489 android 2019-08-07 13:52:46.885 node 1053 size 112:0 data 0000000000000000

如果SYS_BINDER_INFO中没有有效信息,也可以在KERNEL_LOG继续搜索看看是否有有效信息,例如:

[340361.842572] .(0)[10434:kworker/0:2]binder: release 1170:1189 transaction 484462897 out, still active
//debug_id是484462897,找到对端信息:
[340361.959179] .(4)[1011:Binder:567_4]binder: 567:1011 transaction failed 29189/0, size 28-0 line 4487
[340361.960610] .(4)[1011:Binder:567_4]binder: send failed reply for transaction 484462897, target dead
//那么567:1011就是对端

注意:
如果binder server为670:0,表示binder server没有空闲binder,需要查看binder server端的
binder都在做什么事情,是不是有卡住的情况;
如果binder server为0:0,表示binder server process已经挂掉,需要从log中查看是否有其它相
关信息。
如果按照上述方法依然找不到对端,只能按照code逻辑关系请相关module owner帮忙排查

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值