找出程序的调用堆栈 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
详细解决方案
如何打出Android程序调用stack trace
热度:57 发布时间:2024-01-10 08:23:45.0
相关解决方案
- ValueStack 和 Stack Context 有什么区别和联系?该怎么处理
- android 读取byte[]中的元素解决方案
- android 标题栏兑现方式
- android 中Activity向BroadcastReceiver发送数据,该怎么解决
- Android 4.0 为什么模拟器老是提示小弟我谷歌拼音输入法已停止
- android:getSharedPreferences() 这是哪个类的方法解决思路
- android 怎么判断一个程序是否联网
- android RadioButton如何设置默认选中
- android 怎么重新设置锚点
- android 图片对象获取的有关问题
- android 关于服务连接的疑义
- 这个是什么东东 Pool thread stack traces
- android 怎么实现对view的放大和缩小
- android ID,该如何处理
- 准备复习2-3个月,看java+android,请问有经验者,怎么看效果最好》
- android UI线程与AsyncTask的有关问题
- android(java) 中文乱码的有关问题
- 紧急求救!点分页,点多几次出现"stack overflow at line:0"该怎么解决
- stack trace为啥小弟我一点都看不懂
- call stack 窗口怎么恢复
- carbide trace not accessiable解决方法
- carbide trace not accessiable,该如何解决
- android 动态设立控件高度
- Android test project 编译方法
- android 4.03启动出错,显示"Encryption Unsuccessful"该如何解决
- Android 下面的listView的动态效果怎么实现的?求源代码,多谢
- Android?Palm?Symbian?Windows Mobile?学哪个有“钱图”?解决方案
- Android 开发语言,该怎么解决
- 单个人去做手机开发选什么平台好?android,iphone?解决办法
- Android 虚拟机崩溃的有关问题