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:

  1. Process.sendSignal(pid, Process.SIGNAL_QUIT);  

原理和命令行是一样的。

不过需要注意两点:

  1. adb shell可能会没有权限,需要root。
  2. android 4.2中关闭了native thread的堆栈打印,详见 dalvik/vm/Thread.cpp的dumpNativeThread方法:
  1. dvmPrintDebugMessage(target,  
  2.     "\"%s\" sysTid=%d nice=%d sched=%d/%d cgrp=%s\n",  
  3.     name, tid, getpriority(PRIO_PROCESS, tid),  
  4.     schedStats.policy, schedStats.priority, schedStats.group);  
  5. dumpSchedStat(target, tid);  
  6. // Temporarily disabled collecting native stacks from non-Dalvik  
  7. // threads because sometimes they misbehave.  
  8. //dvmDumpNativeStack(target, tid);  
Native堆栈的打印被关掉了!不过对于大多数情况,可以直接将这个注释打开。


更多相关文章

  1. Android常见面试题总结 1.1
  2. Android(安卓)——对HandlerThread的理解和注意事项
  3. Android开发之SurfaceView
  4. Android(安卓)studio爬取网页
  5. Android的线程使用来更新UI----Thread、Handler、Looper、TimerT
  6. Android单个进程内存分配策略
  7. Android异步消息处理机制完全解析-Handler详解
  8. Android进程回收
  9. Android中Handler Runnable与Thread的区别详解

随机推荐

  1. Android(安卓)文本滚动效果的几种实现方
  2. android studio 使用.9图片
  3. [置顶] 【android】通过User-Agent,解决ht
  4. Android内存的全面分析-让你吃透
  5. Android(安卓)xml文件中ID重名问题
  6. android apk反编译到java源码的实现方法
  7. 跟大家分享一下如何成为一名安卓开发者
  8. Android(安卓)Dimension转换算法原理分析
  9. android 9.png图片详解
  10. android Listview 与 Scrollview 共存的