cpp
1. 头文件
#include
#include
#include
2.源文件
android::CallStack stack;
stack.update(1, gettid());
stack.log("satcklog", ANDROID_LOG_ERROR, "stackdump:");
或
stack.log("satcklog", (android_LogPriority)6, "stackdump:");
CallStack 的具体定义见: system/core/libutils/CallStack.cpp3. Makefile
LOCAL_SHARED_LIBRARIES += libutils
也可以在要检查的地方,加入while(1)死循环,然后:
1. debuggerd的堆栈dump
debuggerd是android的一个daemon进程,
负责在进程出错异常时,将进程的运行时信息给dump出来供分析。debuggerd的core dump数据,被保存在
/data/tombstone/
目录下(名字取的也很形象,tombstone是墓碑的意思),共可保存10个文件,当超过10个时,会覆盖重写最早生产的文件。在4.2版本
中,debuggerd同时也是一个工具明了,可以在不中断进程执行的情况下打印堆栈。使用方法是:
debuggerd -b pid
2. zygote的堆栈dump
实际上这个可以同时dump java线程及native线程的堆栈,对于java线程,java堆栈和native堆栈都可以得到。
使用方法很简单,直接在adb shell或串口中输入:
kill -3 pid
如果需要在代码中,更容易控制堆栈的输出时机,可以用以下命令获取zygote的core dump:
- Process.sendSignal(pid, Process.SIGNAL_QUIT);
原理和命令行是一样的。
不过需要注意两点:
- adb shell可能会没有权限,需要root。
- android 4.2中关闭了native thread的堆栈打印,详见 dalvik/vm/Thread.cpp的dumpNativeThread方法:
- dvmPrintDebugMessage(target,
- "\"%s\" sysTid=%d nice=%d sched=%d/%d cgrp=%s\n",
- name, tid, getpriority(PRIO_PROCESS, tid),
- schedStats.policy, schedStats.priority, schedStats.group);
- dumpSchedStat(target, tid);
- // Temporarily disabled collecting native stacks from non-Dalvik
- // threads because sometimes they misbehave.
- //dvmDumpNativeStack(target, tid);