160 likes | 329 Views
Android 常见问题及常用调试方法. 常见问题. Java 异常 程序崩溃 (Native 端 ) 程序无响应 WTF 问题 多线程 / 进程同步问题 Android 重启. Java 程序异常比较简单,系统会抛出异常,当异常未被捕获并正确处理时,程序会终止,并输出调用 trace 通常根据 trace 可以查出出问题的原因 注意,有时候这个错误不是第一现场 注意,在第三方 app 时,可能被加扰. 程序崩溃 (Native 端 ) 需要结合 debuggerd 的信息, logcat trace 等分析,必要时需要接 gdb 进行调试. ANR 问题
E N D
常见问题 • Java异常 • 程序崩溃(Native端) • 程序无响应 • WTF问题 • 多线程/进程同步问题 • Android重启
Java程序异常比较简单,系统会抛出异常,当异常未被捕获并正确处理时,程序会终止,并输出调用traceJava程序异常比较简单,系统会抛出异常,当异常未被捕获并正确处理时,程序会终止,并输出调用trace • 通常根据trace可以查出出问题的原因 • 注意,有时候这个错误不是第一现场 • 注意,在第三方app时,可能被加扰
程序崩溃(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工具分析
Logcat Trace分析 • 常见的异常,如java的exception,error message及用户自定义的trace,可直接输出到logcat trace中分析
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
Eclipse断点调试 • 普通应用程序 • Android SDK/eclipse 基本功能 • Android系统应用 • 参看《深入理解Android 卷II》 • 公司有购买多本,可借阅
CallStack • Java • 抛出异常时,throwable类有实现callstack的logcat输出 • 系统出现异常会打印 • 可在代码中故意抛出异常处处 • 通过anr的trace输出 • ActivityManagerService.dumpStackTraces • Kill -3 <pid> • Native代码 • CallStack • C++直接使用 • CallStack stack; stack.update(); stack.dump(""); • C中需要封装C的接口函数
Debuggerd • Native代码出现异常(常见为段错误)时输出 • Logcat中以 DEBUG tag • 系统在 /data/tombstones/下保存最近的10个 • 运行时分析出错进程状态,对错误现场解析并输出backtrace
ANR分析 • 持锁时间过长的定位 • 死锁的定位 • 主线程卡住太久的定位 • 注:有时app不会出现anr提示,但也会卡住很久,可以自行产生anr的trace来分析