您的位置:首页 > 移动开发 > Android开发

Android 调试技术

2014-04-04 20:51 399 查看


转自: http://www.bobbog.com/archives/19




一、J***A层单步调试

参见“用eclipse单步调试Laucher

参见“用eclipse编译调试adnroid的Browser


二、Native层单步调试

参见“使用GDB 单步调试Android本地代码


三、J***A层堆栈打印


1. 在指定的函数内打印相关java调用

Log.d(TAG,Log.getStackTraceString(new Throwable()));


2. 普通J***A进程堆栈

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 <utils/CallStack.h>
...
CallStack stack;
stack.update();
stack.dump("");  // the parameter is prefix of dump


在使用之前需要修改system/core/include/arch/linux-arm/AndroidConfig.h
#define H***E_DLADDR 1
#define H***E_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/目录下,重启设备。


五、J***A异常分析

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


六、Natvie异常分析

native进程异常会导致

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

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


六、Natvie异常分析(dalvik方式)

用此方法调试由于GC导致的native异常。
修改vm/interp/Stack.c约456行的dvmCallMethodV函数,添加以下几行。

 LOGD(" YINGMINGBO class:%s\n", clazz->descriptor);
 LOGD(" YINGMINGBO name:%s\n", method->name);
 LOGD(" YINGMINGBO desc:%s\n", desc);


七、日志Log系统

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


在Native代码中使用
#define LOG_TAG "YOUR_LOGTAG"
...
#include <utils/Log.h>
#define LOG_NDEBUG 0
...
LOGD("log info");


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


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

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


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


1. 打印指定J***A进程的堆栈到文件中

#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到指定文件,可不用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: