Android 平台log

一、log 分类

aplog

modem log

anr log

panic log

tombstones log

dropbox log

monkey log

last_kernel log

二、aplog

aplog 是分析android 系统问题的基本log,不管是应用crash、 ANR 还是别的各种系统异常,aplog都是很有必要的。

1). aplog 包含android log 和 kernel log,通过 logcat 命令可以捕获。

  

   service apk_logfs /system/bin/logcat -b system -b events -b main -b radio -n 20 -r20480 -v threadtime -f /data/logs/aplog

    class late_startdev/log

    disabled

    seclabel u:r:apk_logfs:s0

 

   这里是在rc 文件里定义的一个log 服务,这样就可以在需要时start这个服务。比如user 版本默认log都是关闭的,但是在user版本遇到问题需要log 时就可以在工程应用里打开log服务捕获log。

 

   -b 指的是要捕获那个缓冲区的log,一般有system events main radio crash kernel 六种类型缓冲区,前5种是android 默认的,kernel 是各平台商自加,实现各不一样,使用时会有差异。有的打印kernel log 需要logcat -b kernel ,有的就不需要。

  frameworks/base/core/java/android/util/Log.java

  public static final int LOG_ID_MAIN = 0;

  public static final int LOG_ID_RADIO = 1;

  public static final int LOG_ID_EVENTS = 2;

  public static final int LOG_ID_SYSTEM = 3;

  public static final int LOG_ID_CRASH = 4;

 

-n 指的是循环保存多少个log文件

-r 指每个log文件最大size,单位是k。-r20480 指的是20M。

-f 是log文件路径

 

2). Aplog读写最终由kernel  logger驱动使用环形缓冲区实现。

 /linux-3.10/drivers/staging/android/logger.c

 

Log 设备节点:

/dev/log/main

/dev/log/radio

/dev/log/system

/dev/log/events


 

 

3). Kernel log 控制:

下面是kernel 定义的log等级

#define KERN_EMERG      KERN_SOH "0"   

#define KERN_ALERT      KERN_SOH "1"   

#define KERN_CRIT       KERN_SOH "2"   

#define KERN_ERR        KERN_SOH "3"   

#define KERN_WARNING    KERN_SOH "4"   

#define KERN_NOTICE     KERN_SOH "5"   

#define KERN_INFO       KERN_SOH "6"   

#define KERN_DEBUG      KERN_SOH "7"   

 

可以在启动kernel 命令行那里定义需要打印的log等级,比如下面定义打印log等级是8,那么所有小于等于这个值的log level都将被打印,否则不打印。

BOARD_KERNEL_CMDLINE += loglevel=8

 

如果loglevel 定义成0,那么等级从 1至7的log将不被打印。

 

可以通过cat /proc/sys/kernel/printk 查看当前的log等级

 如下,第一个值就是当前系统log等级。

cat /proc/sys/kernel/printk

                7

 

可以重新设置系统log等级,如下。

echo 8  > /proc/sys/kernel/printk

 

4). native 层log 打印:

使用LOGE, LOGI, LOGD, LOGV, LOGW 接口打印log,一般默认只有LOGE是打开的,如需要打印别的log,需要在使用时定义#define LOG_NDEBUG 0 或者干脆 #undef NDEBUG 
  
可见 system/core/include/log/log.h 中定义。 
  

二、modem log

      离线modem log保存也是很必要的,在场测过程,在遇到一些非毕现信号问题,都需要开启离线modem log。 
      不同的平台,不同的modem芯片,捕获modem log方法不太一样,大致流程都是打开对应的modem log 端口,发送相应AT指令(如AT+TRACE=1 或at+xsystrace=1) 打开log,之后从端口读取log。 
   

三、ANR log

    Android 默认如下情况将产生ANR: 
 应用处理前台广播超过10秒 
 应用处理后台广播超过60秒 
 应用处理按键消息超过5秒 
 应用或者系统启动一个服务超过10秒 
 所以处理广播和按键消息时不应该直接执行太耗时的动作,可以另外启动线程了执行耗时的动作。 
   
  产生ANR时在aplog 中里找到相应的ANR log,从这里能看到ANR发生前后CPU的使用情况。如果CPU负载高,需要再看哪个进程引起的,是否读写IO,UI线程执行了耗时动作等;如果CPU负载不高,那可能是系统被死锁,死循环给block住了,需要从每个进程的stack信息中进一步分析。 
   
 E ActivityManager: ANR in com.google.android.googlequicksearchbox:search 
 E ActivityManager: CPU usage from 0ms to 8189ms later:  
 E ActivityManager:   105% 11139/com.google.android.googlequicksearchbox:search: 96% user + 8.6% kernel / faults: 37407 minor 19 major 
 E ActivityManager: 52% TOTAL: 32% user + 19% kernel + 0.8% iowait + 0.2% softirq 
 E ActivityManager: CPU usage from 7600ms to 8144ms later: 
 E ActivityManager: 29% TOTAL: 26% user + 2.9% kernel 
   
 同时各进程执行stack保存在/data/anr/trace.txt目录下。一般搜索“held by”字符,看lock 是被哪个线程占用了。然后再分析对应线程正在执行什么动作。 
   

 - waiting to lock <0x1c75fa1d> (a com.android.server.am.ActivityManagerService) held by thread 63

  - waiting to lock <0x1c75fa1d> (a com.android.server.am.ActivityManagerService) held by thread 63

  - waiting to lock <0x1c75fa1d> (a com.android.server.am.ActivityManagerService) held by thread 63

  - waiting to lock <0x1c75fa1d> (a com.android.server.am.ActivityManagerService) held by thread 63

  - waiting to lock <0x1c75fa1d> (a com.android.server.am.ActivityManagerService) held by thread 63

  - waiting to lock <0x1c75fa1d> (a com.android.server.am.ActivityManagerService) held by thread 63

   

四、panic log

      Panic log是分析kernel重启的重要手段,一般能显示重启原因,如空指针重启,狗重启,soft reset、hard rest、调用堆栈信息等。 
   
      在启动kernel 时通过配置 BOARD_KERNEL_CMDLINE += softlockup_panic=0 开启关闭panic开关(0关1开) 
   
 也可以通过写设备节点来控制(/proc/sys/kernel/softlockup_panic) 
   
 panic log 在/data/dontpanic 目录下,如果这里没有保存下来,在 
 /data/syttem/dropbox/SYSTEM_LAST_KMSGxxx.txt.gz 里也能看到。 
   
 手动触发panic 命令:echo c > /proc/sysrq-trigger 
   

五、tombstones log 

 Native 层出现crash时产生tombstones log,保存在/data/tombstones 目录下,里面保存了调用堆栈和寄存器信息,需要共享库符号表和addr2line工具来分析。 
 
   

六、dropbox log

   
 Dropbox 收集了系统重启、crash 、anr等信息,在分析相应问题的时候可以参考Dropbox 目录下的对应文件。 
 在data/sytem/dropbox 目录下。 
   
 七、monkey log  
 是跑monkey时产生的log,里面记录monkey运行过程的一些信息,比如时间点。Monkey 跑停时可以根据monkey log里的时间点和aplog 对应上。Monkey 问题分析同时需要monkey log和 aplog 等log。 
 八、last_kernel log
    Last_kernel log 保存上次重启前的kernel log,该log有助于我们分析重启问题。
     通过配置CONFIG_PSTORE=y 打开该功能。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值