anr trace 中,如何定位binder对端?
时间: 2024-03-16 07:48:08 浏览: 163
通过Android trace文件分析死锁ANR实例过程
在 ANR trace 中定位 Binder 对端可以通过查看 trace 文件中的堆栈信息来实现。在 trace 文件中,可以找到类似以下的信息:
```
DALVIK THREADS:
(mutexes: tll=0 tsl=0 tscl=0 ghl=0)
"main" prio=5 tid=1 SUSPENDED
| group="main" sCount=1 dsCount=0 obj=0x756d7d68 self=0x756c9d48
| sysTid=21521 nice=0 cgrp=default sched=0/0 handle=0x756e0e90
| state=S schedstat=( 0 0 0 ) utm=327 stm=128 core=3 HZ=100
| stack=0xbe1c3000-0xbe1c5000 stackSize=8MB
| held mutexes=
at com.example.demo.MainActivity.hangup(MainActivity.java:33)
- waiting to lock <0x19a4ef7c> (a com.example.demo.MainActivity) held by thread 2
at com.example.demo.MainActivity.access$000(MainActivity.java:13)
at com.example.demo.MainActivity$1.onClick(MainActivity.java:25)
at android.view.View.performClick(View.java:5184)
at android.view.View$PerformClick.run(View.java:20910)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:5942)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
"Binder:21521_1" pri=5 tid=2 RUNNING
| group="main" sCount=1 dsCount=0 obj=0x135e8d58 self=0x757aa000
| sysTid=21524 nice=0 cgrp=default sched=0/0 handle=0x757a2c00
| state=R schedstat=( 0 0 0 ) utm=0 stm=0 core=6 HZ=100
| stack=0x7579b000-0x7579d000 stackSize=1012KB
| held mutexes=
at android.os.BinderProxy.transactNative(Native Method)
at android.os.BinderProxy.transact(Binder.java:496)
at android.app.ActivityManagerProxy.handleApplicationNotResponding(ActivityManagerNative.java:3934)
at com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException(RuntimeInit.java:96)
at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693)
at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690)
```
可以看到,线程 "Binder:21521_1" 在运行,并且持有了某个 mutex,但是没有释放。这时可以通过查看此线程的堆栈信息,发现它是在调用 `android.os.BinderProxy.transactNative` 方法进行 Binder 通信的。从这里可以推断出,线程 "Binder:21521_1" 所在的进程就是 Binder 对端。
在实际应用中,可以通过这种方法来定位 ANR 错误的原因,并分析出问题所在,并进行修复。
阅读全文