稳定性分析1分类

稳定性分析1 bugreport sysrq
1、ANR问题:打开ANR堆栈log,找出报错模块、报错类型、CPU使用率、报错模块各线程工作状态(有无Lock、Held by等)。打开main/system log,重点分析从报错点倒退5~10秒间的异常log。打开event log,重点分析报错前后AMS的调度情况。

2、WATCH DOG问题:打开WATCH DOG堆栈log,找出BLOCK进程、多数情况有Held by/Waiting lock at等字眼,重点分析此类阻塞线程运行情况。

3、TOMBSTONE问题:C层报错,先找到对应工程符号表,采用脚本反编译死机堆栈,结合fault addr值走读相关代码。例如:fault addr 00000000即为空指针问题。无符号表,可以尝试使用IDA工具。

4、应用CRASH/VM REBOOT问题:JAVA层错,此类一般容易解决。结合JAVA堆栈走读相关代码即可。

5、所有问题都可以在GOOGLE开源网站https://android-review.googlesource.com/#/q/status:open搜索一下,看看问题是否已解决。

Bugreport所导出的信息及其庞大,并不是所有的信息都需要我们关注。其中常见的需要重点关注的信息如下:内存、CPU、进程队列、虚拟内存、垃圾回收等信息,以及各个进程所包含的线程的调用堆栈。Bugreport信息虽然信息量庞大,但有个缺点是稍微有些延时,因为bugreport信息每抓取一次,需要消耗大量的时间,而这段时间对于像内存信息,CPU的占有率、各个应用的内存消耗、进程中各个线程的调用栈等信息来说,可能已经变化很大。但是对于像持续抓取的Adb log 等信息仍有较强研究价值。

------ MEMORY INFO (/proc/meminfo) -----

------ CPU INFO (top -n 1 -d 1 -m 30 -t) ------

------ PROCRANK (procrank) ------------ VIRTUAL MEMORY STATS (/proc/vmstat) ------

------ VMALLOC INFO (/proc/vmallocinfo) ------

------ VM TRACES JUST NOW (/data/anr/traces.txt.bugreport: 2011-01-15 16:49:02) ------

------ VM TRACES AT LAST ANR (/data/anr/traces.txt: 2011-01-15 16:49:02) ------

Bugreport信息中有可能也包含暗示内核驱动发生异常的信息。例如包含内核驱动发生异常时的关键信息Apanic信息。Apanic是目前android中所包含的一个基本功能。主要是在系统发生异常的时候,将异常内容保存到系统的特定分区中,在重新启动系统的时候,系统对Apanic分区进行检查的时候将检查到上一次系统发生了一次核心异常,从而就将Apanic分区中的数据直接拷贝到/data/dontpanic中保存为两个文件。一般在进行bugreport的时候,当发生死机后重新启动系统后进行bugreport,有可能会得到如下的信息:

------ LAST PANIC CONSOLE (/data/dontpanic/apanic_console

------ LAST PANIC THREADS (/data/dontpanic/apanic_threads

tombstone文件保存的是异常进程的调用栈信息(包括系统库的函数调用关系),在该进程异常退出或崩溃时由android的后台进程debuggerd负责生成。用户态进程在异常退出时会产生信号,如SIGILL、SIGABRT、SIGBUS、SIGFPE、SIGSEGV、SIGSTKFLT等

/data/system/dropbox下的内容,Dropbox是Android系统中的一个服务,该服务负责记录系统中的各个事件,定时的进行各项记录,从Dropbox的相关记录可以大概的看出系统当前的运行情况。另外它也负责将/data/tombstones下的文件拷贝到/data/system/dropbox中并形成一个压缩文件。

linux内核产生panic大致有以下几种:非法指令、内核访问空指针、硬件错误、死锁引起等。Android系统提供了一种apanic机制将panic时的console信息和threads调用栈信息自动保存到flash中的apanic分区中。具体存储位置在/data/dontpanic/目录下面,其中文件apanic_console记录内核的控制台信息。

SysRq

在Linux系统里, SysRq有另外一个名字The Magice SysRq Key. 之所以称它为Magic, 是因为在Linux系统中, 与SysRq相关联的一系列按键组合可以在系统处于任何的情况下(包括几乎完全失去响应的情况, 这也是SysRq的主要应用场合), 通过Linux kernel对系统进行一些底层的操作. 对此, 还要特别说明一下: 在编译Linux内核的时候, 也可以通过修改配置, 将SysRq的功能禁用掉,目前我们kernel 35中支持的一些命令:

立即重新启动手机echo “b” > /proc/sysrq-trigger

导出内存分配的信息 echo “m” > /proc/sysrq-trigger

导出当前CPU寄存器信息和标志位的信息 echo “p” > /proc/sysrq-trigger

导出线程状态信息 echo “t” > /proc/sysrq-trigger

故意造空指针让系统崩溃 echo “c” > /proc/sysrq-trigger

立即重新挂载所有的文件系统 echo “s” > /proc/sysrq-trigger

立即重新挂载所有的文件系统为只读 echo “u” > /proc/sysrq-trigger

只要内核没有被完全锁住,不管内核在做什么事情,使用sysrq可以立即打印出内核和用户态进程的信息。特别是系统异常但又没有引发panic的时候,可以使用sysrq方式来收集信息。可通过adb shell、串口或按键触发(需额外开发)sysrq抓取有关信息。下面简单介绍一下adb shell环境下sysrq的使用。

打开这个功能,运行:

echo 1 > /proc/sys/kernel/sysrq

关闭这个功能:

echo 0 > /proc/sys/kernel/sysrq

触发sysrq,确保在机器上有root权限,可以把commandkey字符写入到/proc/sysrq-trigger文件,这将触发sysrq事件。如要导出线程状态信息:# echo ‘t’ > /proc/sysrq-trigger

当一个sysrq命令被触发,内核将会打印信息到内核的环形缓冲并输出到系统控制台。Android中导出sysrq信息可以用cat /proc/kmsg来查看。

日记本
相关推荐
一款Android开源项目~牛栋同学
阅读 3237
准备报考MBA?先听听校友的心得!
广告
21道Android高级面试题,面试官都被搞愣了
阅读 4312
Activity 的 36 大难点,你会几个?「建议收藏」
阅读 3048
Android性能优化来龙去脉总结
阅读 1743

发布了81 篇原创文章 · 获赞 0 · 访问量 1304

猜你喜欢

转载自blog.csdn.net/qq_42894864/article/details/104044866