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打出来