zoukankan      html  css  js  c++  java
  • APP测试之日志分析

    logcat日志

    logcat日志文件android日志系统提供了记录和查看系统调试信息的功能,日志都是从各种软件和一些系统的缓冲区中记录下来的,缓冲区可以通过logcat命令来查看和使用。logcat日志是以如下开头的:. .........beginning of xxx。
    开发者选项里,有个选项叫做"日志记录器缓冲区大小” ,默认是256K,日志是循环写入环形缓冲区的。在通常情况下,写满时最旧的日志会被删除以给新输出的日志留内存空间--真机设置,模拟器一般没有。

     保存日志:adb logcat -v time > D:developAndroidlogslogcat.txt

     

    日志由五部分组成
    1、写下日志时的时间,如上中01-11 09:39:35.209,
    2、优先级,在Android中,日志的优先级从低到高分以下几种:

    • V-Verbose (哕嗦,最低级别,开发调试中的一些详细信息,仅在开发中使用,不可在发布产品中输出) D-Debug (调试,用于调试的信息,可以在发布产品中关闭,比较常见) 
    • I-Info (信息,一般提示性的消息)
    • W-Warning (警告)
    • E-Error (错误,已经出现可影响运行的错误,比如应用crash时输出的日志) 

    3、标签(tag),标明日志发起者和方便日志的过滤筛选,如上中ActivityManager,类和模块。

    4、PID (进程ID) ,如上中1749。
    5、正文,本日志的主体内容。

    crash分析

     发生crash, adb logcat获取日志分析:

    1、搜索exception关键字,根据时间, 日志级别E、包名定位

    2、搜索fatal / caused by关键字

    ARN分析

    什么是ARN?

    ANR全名Application Not Responding,也就是应用无响应,当操作在一段时间内系统无法处理时,系统层面会弹出下图那样的ANR对话框,主要是为用户在主线程长时间被阻塞时提供处理交互,提高用户体验 >,它是Android系统的一种自身检测机制。

    ANR类型

    出现ANR的一般有以下几种类型:
    1:KeyDispatchTimeout(常见)
    input事件在5S内没有处理完成发生了ANR。
    logcat日志关键字:Input event dispatching timed out

    2:BroadcastTimeout
    前台Broadcast:onReceiver在10S内没有处理完成发生ANR。
    后台Broadcast:onReceiver在60s内没有处理完成发生ANR。
    logcat日志关键字:Timeout of broadcast BroadcastRecord

    3:ServiceTimeout
    前台Service:onCreateonStartonBind等生命周期在20s内没有处理完成发生ANR。
    后台Service:onCreateonStartonBind等生命周期在200s内没有处理完成发生ANR
    logcat日志关键字:Timeout executing service

    4:ContentProviderTimeout
    ContentProvider 在10S内没有处理完成发生ANR。 logcat日志关键字:Timeout publishing content providers

    ANR出现的原因

    1:主线程频繁进行耗时的IO操作:如数据库读写
    2:多线程操作的死锁,主线程被block;
    3:主线程被Binder 对端block;
    4:system Server中WatchDog出现ANR;
    5:service binder的连接达到上线无法和和System Server通信
    6:系统资源已耗尽(管道、CPU、IO)

    当APP不响应、响应慢了、或者WatchDog的监视没有得到回应时,系统就会dump出一个traces.txt文件,存放在文件目录:/data/anr/traces.txt,通过traces文件,我们可以拿到线程名、堆栈信息、线程当前状态、binder call等信息。

     

     

    字段说明:

    main:main标识是主线程,如果是线程,那么命名成“Thread-X”的格式,x表示线程id,逐步递增。
    prio:线程优先级,默认是5
    tid:tid不是线程的id,是线程唯一标识ID
    group:是线程组名称
    sCount:该线程被挂起的次数
    dsCount:是线程被调试器挂起的次数
    obj:对象地址
    self:该线程Native的地址
    sysTid:是线程号(主线程的线程号和进程号相同)
    nice:是线程的调度优先级
    sched:分别标志了线程的调度策略和优先级
    cgrp:调度归属组
    handle:线程处理函数的地址。
    state:是调度状态
    schedstat:从 /proc/[pid]/task/[tid]/schedstat读出,三个值分别表示线程在cpu上执行的时间、线程的等待时间和线程执行的时间片长度,不支持这项信息的三个值都是0;
    utm:是线程用户态下使用的时间值(单位是jiffies)
    stm:是内核态下的调度时间值
    core:是最后执行这个线程的cpu核的序号。

    然而通过trace只能找到最后一次发生ANR的信息,之前的怎么得到呢?

    > adb pull /date/system/dropbox D:developAndroidlogsdropbox

    通过dropbox可以收集系统一段时间内的异常信息,包括ARN,crash。dropbox指定的文件存放位置为/data/system/dropbox 。

  • 相关阅读:
    Spring AOP 实现原理
    Spring Aop实现方式总结
    Spring Aop重要概念介绍及应用实例结合分析
    Spring Aop
    常见的排序算法
    MINA2.0原理
    Java和Tomcat类加载机制
    Java 8 新特性概述
    Java类加载机制深度分析
    jetty之建立多Connector
  • 原文地址:https://www.cnblogs.com/wangyi0419/p/12053889.html
Copyright © 2011-2022 走看看