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