Android常见问题及常用调试方法 - freshui

Download Report

Transcript Android常见问题及常用调试方法 - freshui

1
常见问题
 Java异常
 程序崩溃(Native端)
 程序无响应
 WTF问题
 多线程/进程同步问题
 Android重启
2
 Java程序异常比较简单,系统会抛出异常,当异常未
被捕获并正确处理时,程序会终止,并输出调用trace
 通常根据trace可以查出出问题的原因
 注意,有时候这个错误不是第一现场
 注意,在第三方app时,可能被加扰
3
 程序崩溃(Native端)
 需要结合debuggerd的信息,logcat trace等分析,必要
时需要接gdb进行调试
 ANR问题
 应用程序无响应,超过一定时间未响应事件
 通常会在 /data/anr下生成trace供分析
 需要注意耗时工作不能在主线程中执行
 需要注意,有时候可能会有anr,但系统未能捕获
 WTF:
 What a terrible failure
 通常会在trace中记录下来,问题比较严重,影响系统进
一步工作
 发生概率不高
 Network的WTF,一直在报
 多线程问题
 死锁
 持锁时间过长
 Java代码的问题:通过anr的trace可以分析到问题原因
 Native代码的问题:比较棘手
 Android重启,Android重启通常:
 发生以上提及的问题
 发生问题的进程是核心进程(system server/zygote)
常用调试方法
 Logcat Trace
 GDB调试
 Eclipse断点调试
 CallStack (Java/Native)
 Debuggerd的分析
 ANR的分析
 Ps/top/vmstat等android工具分析
9
 Logcat Trace分析
 常见的异常,如java的exception,error message及用户
自定义的trace,可直接输出到logcat trace中分析
10
 GDB调试
 小机上运行gdbserver,PC机上运行gdb
 转发端口:

Adb forward tcp:5039 tcp:5039
 Attach 调试进程
 gdbserver :5039 –attach <pid>
 Gdb启动本地端调试(需要使用带符号库)
 <arch-prefix>-gdb <out>/symbol/system/bin/app_process
 与server端连接,调试



set solib-absolute-prefix <absoult_out_path>/symbol/
set solib-search-path <absoult_out_path>/symbol/system/lib
target remote :5039
11
 Eclipse断点调试
 普通应用程序

Android SDK/eclipse 基本功能
 Android系统应用


参看《深入理解Android 卷II》
公司有购买多本,可借阅
12
 CallStack
 Java


抛出异常时,throwable类有实现callstack的logcat输出
 系统出现异常会打印
 可在代码中故意抛出异常处处
通过anr的trace输出
 ActivityManagerService.dumpStackTraces
 Kill -3 <pid>
 Native代码
 CallStack
 C++直接使用
 CallStack stack; stack.update(); stack.dump("");
 C中需要封装C的接口函数
13
 Debuggerd
 Native代码出现异常(常见为段错误)时输出



Logcat中以 DEBUG tag
系统在 /data/tombstones/下保存最近的10个
运行时分析出错进程状态,对错误现场解析并输出backtrace
14
 ANR分析
 持锁时间过长的定位
 死锁的定位
 主线程卡住太久的定位
 注:有时app不会出现anr提示,但也会卡住很久,可以
自行产生anr的trace来分析
15
 Thanks!
16