Android下打印调试堆栈方法

本文介绍了在Android环境下,通过不同方法获取和打印堆栈信息,包括zygote的堆栈dump、debuggerd的堆栈dump、Java代码中使用Throwable类、C++代码中使用CallStack类以及C代码中利用unwind接口打印堆栈。这些方法有助于开发者分析和调试Android应用的运行状态。
摘要由CSDN通过智能技术生成
Android打印堆栈的方法,简单归类一下


1. 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堆栈的打印被关掉了!不过对于大多数情况,可以直接将这个注释打开。


2. debuggerd的堆栈dump


debuggerd是android的一个daemon进程,负责在进程异常出错时,将进程的运行时信息dump出来供分析。debuggerd生成的coredump数据是以文本形式呈现,被保存在 /data/tombstone/ 目录下(名字取的也很形象,tombstone是墓碑的意思),共可保存10个文件,当超过10个时,会覆盖重写最早生成的文件。从4.2版本开始,debuggerd同时也是一个实用工具:可以在不中断进程执行的情况下打印当前进程的native堆栈。使用方法是:


    debuggerd -b <pid> 


这可以协助我们分析进程执行行为,但最最有用的地方是:它可以非常简单的定位到native进程中锁死或错误逻辑引起的死循环的代码位置。


3. java代码中打印堆栈


Java代码打印堆栈比较简单, 堆栈信息获取和输出,都可以通过Throwable类的方法实现。目前通用的做法是在java进程出现需要注意的异常时,打印堆栈,然后再决定退出或挽救。通常的方法是使用exception的printStackTrace()方法:


    try {  
   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值