zoukankan      html  css  js  c++  java
  • 使用trace文件分析ANR

     

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
    本文链接:https://blog.csdn.net/jiangguangchao/article/details/54908477

    ANR定义与分类

    ANR(Application Not Responding):应用程序无响应,是Android中AMS与WMS监测应用响应超时的表现;

    我们应用开发中常见的ANR主要有如下几类:

    • 按键触摸事件派发超时ANR,一般阈值为5s(设置中开启ANR弹窗,默认有事件派发才会触发弹框ANR);
    • 广播阻塞ANR,一般阈值为10s(设置中开启ANR弹窗,默认不弹框,只有log提示);
    • 服务超时ANR,一般阈值为20s(设置中开启ANR弹窗,默认不弹框,只有log提示);



    ANR的定位与分析

    当ANR发生时除过logcat可以看见的log以外我们还可以在系统指定目录下找到traces文件进行分析,发生ANR后我们可以通过如下命令得到ANR trace文件:

    adb pull /data/anr/traces.txt ./
    
    • 1

    然后我们用txt编辑器打开,可以发现如下结构:

    //显示进程id、ANR发生时间点、ANR发生进程包名
    ----- pid 19073 at 2015-10-08 17:24:38 -----
    Cmd line: com.example.yanbo.myapplication
    //一些GC等object信息,通常可以忽略
    ......
    //ANR方法堆栈打印信息!重点!
    DALVIK THREADS (18):
    "main" prio=5 tid=1 Sleeping
      | group="main" sCount=1 dsCount=0 obj=0x7497dfb8 self=0x7f9d09a000
      | sysTid=19073 nice=0 cgrp=default sched=0/0 handle=0x7fa106c0a8
      | state=S schedstat=( 125271779 68162762 280 ) utm=11 stm=1 core=0 HZ=100
      | stack=0x7fe90d3000-0x7fe90d5000 stackSize=8MB
      | held mutexes=
      at java.lang.Thread.sleep!(Native method)
      - sleeping on <0x0a2ae345> (a java.lang.Object)
      at java.lang.Thread.sleep(Thread.java:1031)
      - locked <0x0a2ae345> (a java.lang.Object)
    //真正导致ANR的问题点,可以发现是onClick中有sleep导致。我们平时可以类比分析即可,这里不详细说明。
      at java.lang.Thread.sleep(Thread.java:985)
      at com.example.yanbo.myapplication.MainActivity$1.onClick(MainActivity.java:21)
      at android.view.View.performClick(View.java:4908)
      at android.view.View$PerformClick.run(View.java:20389)
      at android.os.Handler.handleCallback(Handler.java:815)
      at android.os.Handler.dispatchMessage(Handler.java:104)
      at android.os.Looper.loop(Looper.java:194)
      at android.app.ActivityThread.main(ActivityThread.java:5743)
      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:988)
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:783)
    ......
    //省略一些不常关注堆栈打印
    ......

    OK,ANR分析结束。

  • 相关阅读:
    值得收藏的十二条Jquery随身笔记
    都来中大奖啦~双色球随机算法!
    巧妙使用div+css模拟表格对角线
    介绍两个非常好用的Javascript内存泄漏检测工具
    JQuery模仿淘宝天猫魔盒抢购页面倒计时效果
    JQuery巧妙利用CSS操作打印样式
    boost编译随笔
    Dev-C++安装第三方库boost
    比特币源码分析--C++11和boost库的应用
    QT +go 开发 GUI程序
  • 原文地址:https://www.cnblogs.com/xgjblog/p/11464910.html
Copyright © 2011-2022 走看看