1、查看Android各个版本源码

http://androidxref.com/

2. 获取Trace

调用栈信息(Trace)是分析异常经常使用的,这里简单划分两类情况:

  • 当前线程Trace: 当前执行流所在线程的调用栈信息;
  • 目标进程Trace:可获取目标进程的调用栈,用于动态调试;

2.1 当前线程Trace

1) Java层

Thread.currentThread().dumpStack();   //方法1
Log.d(TAG,"Gityuan", new RuntimeException("Gityuan")); //方法2
new RuntimeException("Gityuan").printStackTrace(); //方法3

2) Native层

#include <utils/CallStack.h>
android::CallStack stack(("Gityuan"));

2.2 目标进程Trace

1) Java层

adb shell kill -3 [pid]     //方法1
Process.sendSignal(pid, Process.SIGNAL_QUIT)  //方法2

生成trace文件保存在文件data/anr/traces.txt

2) Native层

adb shell debuggerd -b [tid] //方法1
Debug.dumpNativeBacktraceToFile(pid, tracesPath) //方法2

前两条命令输出内容相同:

  • 命令1输出到控制台
  • 命令2输出到目标文件

对于debuggerd命令,若不带参数则输出tombstones文件,保存到目录/data/tombstones

3) Kernel层

adb shell cat /proc/[tid]/stack  //方法1
WatchDog.dumpKernelStackTraces() //方法2

其中dumpKernelStackTraces()只能用于打印当前进程的kernel线程

2.3 小节

以下分别列举输出Java, Native, Kernel的调用栈方式:

类别 函数式 命令式
Java Process.sendSignal(pid, Process.SIGNAL_QUIT) kill -3 [pid]
Native Debug.dumpNativeBacktraceToFile(pid, tracesPath) debuggerd -b [pid]
Kernel WD.dumpKernelStackTraces() cat /proc/[tid]/stack

分析异常时往往需要关注的重要目录:

/data/anr/traces.txt
/data/tombstones/tombstone_X
/data/system/dropbox/

3. 时间调试

为了定位耗时过程,有时需要在关注点添加相应的systrace,而systrace可跟踪系统cpu,io以及各个子系统运行状态等信息,对于kernel是利用Linux的ftrace功能。当然也可以直接在方法前后加时间戳,输出log的方式来分析。

3.1 新增systrace

1) App

import android.os.Trace;
void foo() {Trace.beginSection("app:foo");...Trace.endSection();
}

2) Java Framework

import android.os.Trace;
void foo() {Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "fw:foo");...Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
}

3) Native Framework

#define ATRACE_TAG ATRACE_TAG_GITYUAN
#include <utils/Trace.h> // used for C++
#include <cutils/trace.h> // used for C
void foo() {ATRACE_CALL();...
}

或者

#define ATRACE_TAG ATRACE_TAG_GITYUAN
#include <utils/Trace.h> // used for C++
#include <cutils/trace.h> // used for C
void foo() {ATRACE_BEGIN();...ATRACE_END();
}

3.2 打印时间戳

1) Java

import android.util.Log;
void foo(){long startTime = System.currentTimeMillis();...long spendTime = System.currentTimeMillis() - startTime;Log.i(TAG,"took " + spendTime + “ ms.”);
}

2) C/C++

#include <stdio.h>
#include <sys/time.h>
void foo() {struct timeval time;gettimeofday(&time, NULL); //精度usprintf("took %lld ms.\n", time.tv_sec * 1000 + time.tv_usec /1000);
}

3.3 kernel log

有时候Kernel log的输出是由级别限制,可通过如下命令查看:

adb shell cat /proc/sys/kernel/printk
4       4       1       7

参数解读:

  • 控制台日志级别:优先级高于该值的消息将被打印至控制台。
  • 缺省的消息日志级别:将用该值来打印没有优先级的消息。
  • 最低的控制台日志级别:控制台日志级别可能被设置的最小值。
  • 缺省的控制台日志级别:控制台日志级别的缺省值

日志级别:

级别 说明
KERN_EMERG 0 致命错误
KERN_ALERT 1 报告消息
KERN_CRIT 2 严重异常
KERN_ERR 3 出错
KERN_WARNING 4 警告
KERN_NOTICE 5 通知
KERN_INFO 6 常规
KERN_DEBUG 7 调试

Log相关命令

  • dmesg 或 cat /proc/kmsg
  • logcat -L 或 cat /proc/last_kmsg
  • logcat -b events -b system

4. addr2line

addr2line功能是将函数地址解析为函数名。分析过Native Crash,那么对addr2line一定不会陌生。 addr2line命令参数:

Usage: addr2line [option(s)] [addr(s)]The options are:@<file>                Read options from <file>-a --addresses         Show addresses-b --target=<bfdname>  Set the binary file format-e --exe=<executable>  Set the input file name (default is a.out)-i --inlines           Unwind inlined functions-j --section=<name>    Read section-relative offsets instead of addresses-p --pretty-print      Make the output easier to read for humans-s --basenames         Strip directory names-f --functions         Show function names-C --demangle[=style]  Demangle function names-h --help              Display this information-v --version           Display the program's version

4.1 Native地址转换

Step 1: 获取symbols表

先获取对应版本的symbols,即可找到对应的so库。(最好是对应版本addr2line,可确保完全匹配)

Step 2: 执行addr2line命令

// 64位
cd prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin
./aarch64-linux-android-addr2line -f -C -e libxxx.so  <addr1>//32位
cd /prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin
./arm-linux-androideabi-addr2line -f -C -e libxxx.so  <addr1>

另外,有兴趣可以研究下development/scripts/stack,地址批量转换工具。

4.2 kernel地址转换

addr2line也适用于调试分析Linux Kernel的问题。例如,查询如下命令所对应的代码行号

[<0000000000000000>] binder_thread_read+0x2a0/0x324

Step 1: 获取符号地址

通过命令arm-eabi-nm从vmlinux找到目标方法的符号地址,其中nm和vmlinux所在目录:

  • arm-eabi-nm位于目录prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin/
  • vmlinux位于目录out/target/product/xxx/obj/KERNEL_OBJ/

执行如下命令:(需要带上绝对目录)

arm-eabi-nm  vmlinux |grep binder_thread_read

则输出结果: c02b2f28 T binder_thread_read,可知binder_thread_read的符号地址为c02b2f28, 其偏移量为0x2a0,则计算后的目标符号地址= c02b2f28 + 2a0,然后再采用addr2line转换得到方法所对应的行数

Step 2: 执行addr2line命令

./aarch64-linux-android-addr2line -f -C -e vmlinux [目标地址]

Android 系统调试(2)---android debug 方法相关推荐

  1. android系统自动休眠代码流程,一种基于Android系统下的可控休眠方法及系统与流程...

    本发明涉及一种手机应用,尤其涉及一种基于android系统下的可控休眠方法及系统. 背景技术: android设备的休眠指的是当长时间不用手机时手机会自动进入一个省电模式,调低或者关闭一部分电压的输出 ...

  2. android 监控行为,一种针对Android系统App行为的监控方法

    主权项: 1.一种针对Android系统App行为的监控方法,通过安全内核实现方法在Android内核层添加模块,实现对整个Android系统的系统调用的拦截与监控:包括如下步骤:S1.编写内核模块: ...

  3. android 音频播放过程,一种Android系统中的音频播放方法与流程

    本申请涉及android系统技术,特别涉及一种android系统中的音频播放方法. 背景技术: 在android系统中,现有的使用audiotrack进行音频播放时,audiotrack应用与andr ...

  4. android 消息推送方法,一种基于Android系统的消息推送方法技术方案

    [技术实现步骤摘要] 本专利技术涉及一种基于Android系统的消息推送方法,属于计算机 技术介绍 推送功能在手机应用开发中越来越重要,已经成为手机开发的必选项.消息推送,就是在互联网上通过定期传送用 ...

  5. android字符串块,一种Android系统字符串提取及合并方法与流程

    本发明涉及字符串提取及合并方法,尤其涉及一种Android系统字符串提取及合并方法. 背景技术: 随着智能通讯终端的日益普及,采用Android系统的智能通讯终端设备越来越走向世界各地,而对于多国语言 ...

  6. spatialite android,一种基于Android系统的Spatialite空间数据库加密方法与流程

    本发明属于数据库技术领域,具体涉及一种基于Android系统的Spatialite空间数据库加密方法. 背景技术: 随着经济建设及智能终端和移动GIS技术的不断发展,终端的CPU.GPU.内存.显示屏 ...

  7. android系统recovery模式,Android系统Recovery模式中文详细说明

    Recovery具体功能: 1.刷系统:新下载好的rom,,直接放sd卡上刷(进nand),,无需windows! 2.像电脑的ghost,,允许用户随意将系统和里面的个人资料备份成一个文件,,并允许 ...

  8. [转] Android系统版本号和Android API level对应表

    平时总会去查 Android系统版本号和Android API level对应关系,有时候上不了Google,网上搜的又不全.这里翻译记录下,顺便给出原文网址:https://developer.an ...

  9. Android系统调试(02)ANR问题总结

    该系列文章总纲链接:专题分纲目录 Android系统基础 ANR问题是Android系统中比较常见的问题,当出现ANR时一般情况会弹出一个带有以下文字的对话框提示(Android版本不同,展示效果会有 ...

  10. android系统关机广播,android关机方法汇总

    有段时间做系统hook时需要用到系统重启,找了几种重启的方法,还有几种关机的方法,总结一下. 一,发送广播 Broadcast, Intent.ACTION_REQUEST_SHUTDOWN关机广播 ...

最新文章

  1. **Git本地仓库图解
  2. 比特币和比特币现金就隐私保护展开辩论
  3. 【数理知识】《随机过程》方兆本老师-目录
  4. Python安装与简单使用
  5. Android BLE学习(二): Android与51822蓝牙模块通信流程的实现与分析
  6. 网络恶意营销账号猖獗,国家网信办出手了
  7. 软件测试基础:测试用例设计
  8. 【bzoj2338】[HNOI2011]数矩形 计算几何
  9. 【备忘】船舶的几个吨位概念
  10. C#添加二维码带加密带logo
  11. 维宏云智能工厂系统1.0全面升级,带你体验豪华智能制造
  12. 同时买票是怎么实现的_如果是你来构建火车票订票系统,你如何实现?
  13. 开源电子书项目FBReader初探(四)
  14. ubuntu18.04 下海康工业相机hikrobot_camera的使用及问题的解决
  15. 朋友走了 失落感来了
  16. 苹果系统装win7教程
  17. 三菱PLC增量式PID算法FB(带死区设置和外部复位控制)
  18. 使用微信小程序扫码登录系统PC端web的功能
  19. EasyRecovery14最新个人版数据恢复工具
  20. 手把手做一个JSP入门程序(一):程序基本介绍(JSP)

热门文章

  1. linux 设备驱动初学(一)
  2. java 如何结束线程_java中,如何安全的结束一个正在运行的线程?
  3. 计算机应用基础的文档,计算机应用基础
  4. php基础知识填空题,比较基础的php面试题及答案填空题
  5. ExecutorService--线程池
  6. P1396 营救(并查集+二分)
  7. 杭电oj首字母变大写
  8. 2017《时间的朋友》思维导图(脑图整理版)
  9. 实现二叉排序树的各种算法
  10. Android 开发笔记 ProgressDialog的Back健关闭