打印android函数调用栈

1. java层

Exception e = new Exception("TAG");

e.printStackTrace();

 

2.  Native C++

android::CallStack cs("TAG");

Android在5.0, 6.0里加入了CallStack类,这个类可以打出当前的backtrace。

确保包含头文件#include <utils/CallStack.h>

 Android.mk的库依赖列表(LOCAL_SHARED_LIBRARIES)里包含libutils,一般都已经包含了。

对应位置加入android::CallStack cs("TAG");

如果上下文已经在android namespace里,”android::”前缀就不必加了。

 

3.  Native C

Android对C的堆栈打印支持不太好。过去网上的文章一般是推荐libcorkscrew.so,并加入大段代码来unwind_backtrace。新版Android上libcorkscrew已经被拿掉了,网上的加载libcorkscrew库的方法自然就不能用了。

一个简单方法是用C语言调C++的函数,对,就是extern “C”。

先在项目里加入一个c++文件,比如callstack.cpp,里面是:

#include <utils/CallStack.h> 
extern "C" void dumping_callstack(void); 
void dumping_callstack(void) { 
    android::CallStack cs("haha"); 
}

在项目里再加入一个c++的头文件,比如callstack.h,里面是:

void dumping_callstack(void);

在Android.mk里源文件列表LOCAL_SRC_FILES里加入callstack.cpp,确保libutils在依赖列表里。

在native C里include callstack.h后直接调用dumping_callstack()就可以了。

这个log也可以在logcat里看到。

 

4. linux kernel

dump_stack()   //打出当前堆栈和函数调用backtrace后接着运行

WARN_ON(x) //跟dump_stack很像,但是有个条件,如果条件满足了就把stack打出来

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值