java 安卓调试_【转】Android 调试技术

一、JAVA层单步调试

二、Native层单步调试

三、JAVA层堆栈打印

1. 在指定的函数内打印相关java调用 Log.d(TAG,Log.getStackTraceString(new Throwable()));

2. 普通JAVA进程堆栈 ActivityManagerService.dumpStackTraces

保存在系统设置dalvik.vm.stack-trace-file指定的文件data/anr/traces.txt中。可以包含多个进程堆栈信息。

3. 内核进程堆栈

dumpKernelStackTraces,该函数为私有函数,不可调用。

代码在frameworks/base/services/java/com/android/server/Watchdog.java

保存在系统设置dalvik.vm.stack-trace-file指定的文件data/anr/traces.txt中。

4. 出异常时打印当前堆栈

Exception::printStackTrace() try { ... } catch (RemoteException e) {   e.printStackTrace();   ... }

5. 输出指定进程的堆栈 Process.sendSignal(pid, Process.SIGNAL_QUIT)

保存在data/anr/traces.txt。

这个只对java进程有效,由dalvikvm的SignalCatcher.c处理。

四、Native层堆栈打印

1. CallStack

使用方式: #include ... CallStack stack; stack.update(); stack.dump("");  // the parameter is prefix of dump

在使用之前需要修改system/core/include/arch/linux-arm/AndroidConfig.h #define HAVE_DLADDR 1 #define HAVE_CXXABI 1

并在文件frameworks/base/libs/utils/Android.mk中大约105行(LOCAL_SHARED_LIBRARIES)后添加 ifeq ($(TARGET_OS),linux) LOCAL_SHARED_LIBRARIES += libdl endif

重新编译,push生成的libutils.so到/system/lib/目录下,重启设备。

五、JAVA异常分析

这个android会输出信息到logcat。容易分析。

六、Natvie异常分析

native进程异常会导致

debuggerd会输出信息到logcat并保存到/data/tombstones。

可以修改system/core/debuggerd/debuggerd.c中dump_stack_and_code的代码满足更深的调试信息需求。

七、日志Log系统

在java中使用 import android.util.Log; ... Log.d(TAG,"log info");

在Native代码中使用 #define LOG_TAG "YOUR_LOGTAG" ... #include #define LOG_NDEBUG 0 ... LOGD("log info");

或者 Log.d(LOG_TAG,“log info”);

使用adb logcat时可以只显示特定类别的LOG,还可以通过参数 -v threadtime 显示线程号及时间信息。

普通标准输出转为Logcat #system/bin/logwrapper 进程名

八、其他调试手段(命令行)

1. 打印指定JAVA进程的堆栈到文件中 #kill -3 pid

这里的3就是3.5节的Process.SIGNAL_QUIT。

输出在data/anr/traces.txt文件中。

这个只对java进程有效,由dalvikvm处理。

2. 打印指定进程的堆栈到Logcat #kill -11 pid 或者 #kill -7 pid

这个有时有效。其原理是利用了(六)节的机制。

可以用adb logcat看堆栈调用输出。

3. 打印指定进程的系统调用 #strace -f -p pid -o output

主要输出文件、SOCKET、锁等系统操作的信息。

-f表示跟踪所有子进程.

-o输出log到指定文件,可不用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值