打印调用栈
我们在实际开发中经常会遇到两种种情况:
- 1.是谁调用了这个函数,为什么程序会跑到这里来了?
- 2.我们要分析代码的调用流程。
我们首先应该都会 grep
一下,或者使用 source insight
等工具搜一下调用函数,一般情况下就能解决问题。但是当遇到情况很多调用,情况又十分复杂的使用就要使用我们的必杀技,打印调用栈。
一.先看java
层的
java
层的比较简单 ,只需要使用下面的函数就能打印出来。
在需要打印的函数中加入
Log.d("haha",Log.getStackTraceString(new Throwable()));
修改之后在命令行使用logcat
logcat -s haha
当有运行到这个函数时就能打印出调用的函数调用光系,如下图:
补充:
异常时打印当前堆栈
在catch
中加入 Exception::printStackTrace()
就能把调用栈打印出来
二.c / c++
层
android 4.4
平台使用的例子
加入头文件并在需要打印的函数中使用下面的函数
#include <utils/CallStack.h>
android::CallStack stack("haha");
之后同java
一样使用
logcat -s haha
当有运行到这个函数时就能打印出调用栈,如下图:
三.内核
直接在要打印调用栈的函数中加入这个函数,当函数执行到这里,就会通过串口(cat /proc/kmsg
)看到信息输出。
dump_stack();