打印函数调用堆栈

有时候希望知道函数被哪里调用了,但是源码太多,逐个加打印肯定是不方便的,以下记录跟踪函数调用栈信息的方法。

Native C++

  1. 头文件包含

    1
    #include <utils/CallStack.h>
  2. 在需要打印堆栈的地方添加

    1
    android::CallStack stack("CALLSTACK");

    CALLSTACK是在logcat中输出的TAG

  3. Android.mk添加

    1
    2
    LOCAL_SHARED_LIBRARIES += libutilscallstack
    LOCAL_SHARED_LIBRARIES += libutils

Native C

通过C语言调用C++的函数,即extern C。

在项目里添加一个c++文件callstack.cpp

1
2
3
4
5
6
7
8
#include <utils/CallStack.h>
#include "callstack.h"
extern "C" {
void dumping_callstack(void)
{
android::CallStack stack("CALLSTACK");
}
}

添加一个callstack.h

1
2
3
4
5
6
7
8
9
10
#ifndef _CALLSTACK_H
#define _CALLSTACK_H
#ifdef __cplusplus
extern "C" {
#endif
void dumping_callstack(void);
#ifdef __cplusplus
}
#endif
#endif

修改Android.mk

1
2
3
LOCAL_SRC_FILES += callstack.cpp
LOCAL_SHARED_LIBRARIES += libutilscallstack
LOCAL_SHARED_LIBRARIES += libutils

在native C里面包含头文件

1
#include "callstack.h"

然后调用

1
dumping_callstack();

Java

1
2
Exception e = new Exception("CALLSTACK");
e.printStackTrace();

log在logcat中可以看到。

Linux Kernel

1
dump_stack();