android c++ 打印调用堆栈
cpp1. 头文件#include#include#include2.源文件android::CallStackstack;stack.update(1, gettid());stack.log("satcklog", ANDROID_LOG_ERROR, "stackdump:");或stack.log("satcklog",(android_LogPriority)6, "stackdump:
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
更多推荐
所有评论(0)