Android trace文件分析小技巧

Android anr trace文件分析小技巧

网上有很多trace文件分析博客,但是都是解释anr发生得原因,没有指导anr文件如何着手分析?本篇文章就是讲trace文件怎么切入?

trace文件中得异常可能

和网上其它博客一样,先讲讲异常发生得可能,哪些异常会被捕获到trace文件,可能是争抢锁lock、耗时等待、内存资源不足等等,具体可以看链接ANR日志分析全面解析

trace文件分析

不同版本可能trace文件有所不同,比如Android 10得trace文件没发现由cpu usage等等,也可能是我看漏,重点来了如何查看trace文件中得异常栈:

一般anr都是由main相关线程阻塞引起的,搜索关键字main 的线程看,如下:

"main" prio=5 tid=1 Blocked
  | group="main" sCount=1 dsCount=0 flags=1 obj=0x72bcedd8 self=0x72b02aec00
  | sysTid=638 nice=-2 cgrp=default sched=0/0 handle=0x72b1810ed0
  | state=S schedstat=( 2146765176 863507820 5198 ) utm=169 stm=45 core=2 HZ=100
  | stack=0x7ffd09f000-0x7ffd0a1000 stackSize=8192KB
  | held mutexes=
  at com.android.server.am.ActivityManagerService.broadcastIntent(ActivityManagerService.java:15566)
  - waiting to lock <0x0c0b7103> (a com.android.server.am.ActivityManagerService) held by thread 90
  at android.app.ContextImpl.sendBroadcastAsUser(ContextImpl.java:1224)
  at com.android.server.AlarmManagerService$2.lambda$doAlarm$0$AlarmManagerService$2(AlarmManagerService.java:1546)
  at com.android.server.-$$Lambda$AlarmManagerService$2$Eo-D98J-N9R2METkD-12gPs320c.run(lambda:-1)
  at android.os.Handler.handleCallback(Handler.java:883)
  at android.os.Handler.dispatchMessage(Handler.java:100)
  at android.os.Looper.loop(Looper.java:214)
  at com.android.server.SystemServer.run(SystemServer.java:549)
  at com.android.server.SystemServer.main(SystemServer.java:351)
  at java.lang.reflect.Method.invoke(Native method)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:913)

如果出现问题了,main下面就有java的异常栈,我们就可以从这个java异常栈找问题,如果没有java异常栈,说明是没有问题的,那就只有往后一个一个线程tid看,直到有java异常栈就打住,仔细分析;
很明显上面有一句:

 waiting to lock <0x0c0b7103> (a com.android.server.am.ActivityManagerService) held by thread 90

main线程在等待lock0x0c0b7103锁,但是这个锁又被90这个线程持有,但是没有释放,那就要看看90这个线程

90线程

"Binder:638_4" prio=5 tid=90 Blocked
  | group="main" sCount=1 dsCount=0 flags=1 obj=0x13117ea0 self=0x7175a80000
  | sysTid=900 nice=-2 cgrp=default sched=0/0 handle=0x716f22ad50
  | state=S schedstat=( 400588157 333711412 1210 ) utm=31 stm=8 core=1 HZ=100
  | stack=0x716f134000-0x716f136000 stackSize=991KB
  | held mutexes=
  at com.android.server.wm.WindowProcessController.setThread(WindowProcessController.java:204)
  - waiting to lock <0x0df0d024> (a com.android.server.wm.WindowManagerGlobalLock) held by thread 207
  at com.android.server.am.ProcessRecord.makeInactive(ProcessRecord.java:637)
  at com.android.server.am.ActivityManagerService.cleanUpApplicationRecordLocked(ActivityManagerService.java:13693)
  at com.android.server.am.ActivityManagerService.handleAppDiedLocked(ActivityManagerService.java:3601)
  at com.android.server.am.ActivityManagerService.appDiedLocked(ActivityManagerService.java:3753)
  at com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied(ActivityManagerService.java:1504)
  - locked <0x0c0b7103> (a com.android.server.am.ActivityManagerService)
  at android.os.BinderProxy.sendDeathNotice(BinderProxy.java:620)

很明显,这个90线程需要lock <0x0df0d024>锁,同时持有lock<0x0c0b7103>,但是lock <0x0df0d024>又被207线程持有,没办法,看看207线程。

207线程

"Binder:638_12" prio=5 tid=207 Blocked
  | group="main" sCount=1 dsCount=0 flags=1 obj=0x12f806b0 self=0x71778f7000
  | sysTid=1758 nice=-4 cgrp=default sched=0/0 handle=0x70e5e54d50
  | state=S schedstat=( 437566875 650319463 2262 ) utm=33 stm=10 core=1 HZ=100
  | stack=0x70e5d5e000-0x70e5d60000 stackSize=991KB
  | held mutexes=
  at com.android.server.am.ActivityManagerService.broadcastIntent(ActivityManagerService.java:15566)
  - waiting to lock <0x0c0b7103> (a com.android.server.am.ActivityManagerService) held by thread 90
  at android.app.ContextImpl.sendBroadcast(ContextImpl.java:1049)
  at com.android.server.wm.ActivityRecord.sendBroadcastVREnable(ActivityRecord.java:436)
  at com.android.server.wm.ActivityRecord.onWindowsGone(ActivityRecord.java:2458)
  at com.android.server.wm.AppWindowToken.onWindowsGone(AppWindowToken.java:457)
  at com.android.server.wm.AppWindowToken.updateReportedVisibilityLocked(AppWindowToken.java:444)
  at com.android.server.wm.WindowManagerService.postWindowRemoveCleanupLocked(WindowManagerService.java:1838)
  at com.android.server.wm.WindowState.removeImmediately(WindowState.java:1925)
  at com.android.server.wm.WindowState.removeIfPossible(WindowState.java:2048)
  at com.android.server.wm.WindowState.access$300(WindowState.java:216)
  at com.android.server.wm.WindowState$DeathRecipient.binderDied(WindowState.java:2498)
  - locked <0x0df0d024> (a com.android.server.wm.WindowManagerGlobalLock)
  at android.os.BinderProxy.sendDeathNotice(BinderProxy.java:620)

很明显207线程需要lock <0x0c0b7103>,自己持有locked <0x0df0d024>,但是lock <0x0c0b7103>又被90线程持有,这不就是发生死锁了吗?

这不就是我们学习的死锁吗?至于如何解决这种问题,网上很多,不在本文的重点,本文就是教大家如何分析trace文件,相信大家看了上面的案例已经学会如何分析了

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
NS2是一款广泛使用的网络仿真软件,它可以模拟各种类型的网络,例如有线和无线网络、卫星网络、移动自组网等。在NS2中,trace文件是记录网络仿真过程中的事件和数据的一种文件格式,它可以用来分析网络性能和行为。 下面是NS2的trace文件分析过程: 1.生成trace文件 在NS2中,可以通过在tcl脚本中添加“trace”命令来生成trace文件,例如: set tracefile [open out.tr w] $ns trace-all $tracefile 这段代码将生成名为“out.tr”的trace文件,并记录仿真过程中所有的事件和数据。 2.使用trace分析工具 NS2的trace文件可以使用多种工具进行分析,例如: (1)xgraph:用于绘制图表,例如绘制网络拓扑结构、吞吐量、延迟等。 (2)nam:用于可视化网络仿真过程,例如展示节点的移动轨迹、数据包的传输路径等。 (3)tracegraph:用于分析trace文件,例如统计网络流量、分析吞吐量、延迟、数据包丢失率等。 3.分析trace文件内容 在trace文件中,每一行记录了一个事件或数据,常见的事件包括节点的发送、接收、丢失等,常见的数据包括发送时间、到达时间、源地址、目的地址、数据包大小、传输延迟等。通过分析trace文件,可以了解网络的性能和行为,例如: (1)统计网络吞吐量:通过分析trace文件中的数据包大小和到达时间,可以计算出网络的吞吐量。 (2)分析网络延迟:通过分析trace文件中的数据包发送时间和到达时间,可以计算出数据包的传输延迟,从而了解网络的延迟情况。 (3)分析数据包丢失率:通过分析trace文件中的数据包发送和接收事件,可以计算出数据包的丢失率,从而了解网络的可靠性情况。 综上所述,NS2的trace文件分析是网络仿真中的重要环节,通过对trace文件分析,可以了解网络的性能和行为,从而指导网络的设计和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

帅气好男人_Jack

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值