如何打出Android程序调用stack trace

找出程序的调用堆栈 trace 可以知道是谁调用了这个接口,也能快速学习程序的调用流程,非常实用。但需要注意的是,不能在正式代码中使用,只能用于调试,这个非常耗资源也会造成 log 泛滥。

下面就介绍如何在 Android Java/C++/C 程序当中打印出程序调用 trace,如果需要在其他环境中使用的话 C++/C 部分需要移植 corkscrew 库。

Java
非常简单,创建一个 Throwable 对象,就可以得到当前的 stack trace。下面例子是打出调用 foobar() 函数的 trace:

1 private void foobar() {
2     Throwable t = new Throwable();
3     Log.d(TAG, "stack trace is ", t);
4 }
C++
也比较简单,使用 utils/Callstack 类即可。头文件位于 frameworks/native/include/utils/CallStack.h,一般无需修改 Android.mk 可直接使用。下面例子是打出调用 Foo::bar() 函数的 trace:

复制代码
1 #include <utils/CallStack.h> 
2 
3 void Foo::bar() {
4     // CallStack::CallStack(const char* logtag, int32_t ignoreDepth, int32_t maxDepth)
5     CallStack *t = new CallStack("Trace", 1, 30);
6     delete t;
7 }
复制代码
C
稍微麻烦一点,需要直接调用 corkscrew/backtrace。其实 C++ 里的 utils/Callstack 也是使用 corkscrew/backtrace,只是进行了封装更易于使用。我们参照 CallStack.cpp 里面代码即可。下面例子是打出调用 foobar() 函数的 trace:

NOTE: C 不能直接调用 C++ 代码,除非在 C++ 类中添加相应的 C wrapper,或者通过 dlsym 动态载入。

复制代码
 1 #include <corkscrew/backtrace.h> 
 2 
 3 void dumpStackTrace(const char* logtag, int32_t ignoreDepth, int32_t maxDepth) const {
 4     static const int MAX_DEPTH = 31;
 5     static const int MAX_BACKTRACE_LINE_LENGTH = 800;
 6 
 7     if (maxDepth > MAX_DEPTH) {
 8         maxDepth = MAX_DEPTH;
 9     }
10     backtrace_frame_t mStack[MAX_DEPTH];
11     ssize_t count = unwind_backtrace(mStack, ignoreDepth + 1, maxDepth);
12     if (count <= 0) {
13         LOGE("Can not get stack trace");
14         return;
15     }
16     
17     backtrace_symbol_t symbols[count];
18 
19     get_backtrace_symbols(mStack, count, symbols);
20     for (size_t i = 0; i < count; i++) {
21         char line[MAX_BACKTRACE_LINE_LENGTH];
22         format_backtrace_line(i, &mStack[i], &symbols[i],
23                 line, MAX_BACKTRACE_LINE_LENGTH);
24         ALOG(LOG_DEBUG, logtag, "%s%s",
25                 "",
26                 line);
27     }
28     free_backtrace_symbols(symbols, count);
29 }
30 
31 void foobar() {
32     dumpStackTrace("Trace", 1, 30);
33 }
复制代码
头文件位于 system/core/include/corkscrew/backtrace.h,在 Android.mk 中还需要加入:

1 LOCAL_SHARED_LIBRARIES += libcorkscrew
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值