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.cpp
3. 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

输出的trace会保存在 /data/anr/traces.txt文件中。这个需要注意,如果没有 /data/anr/这个目录或/data/anr/traces.txt这个文件,需要手工创建一下,并设置好读写权限。
如果需要在代码中,更容易控制堆栈的输出时机,可以用以下命令获取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);  
Native堆栈的打印被关掉了!不过对于大多数情况,可以直接将这个注释打开。

————————————————
原文链接:https://blog.csdn.net/tuyerv/article/details/96426224

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐