cpp层打印调用栈
方法1(推荐)
直接在要加堆栈打印的cpp文件里面加入如下代码段,在要打印的函数里面直接调用print_trace()即可。
#include <execinfo.h>
void print_trace (void)
{
void *array[10];
size_t size;
char **strings;
size_t i;
size = backtrace (array, 10);
strings = backtrace_symbols (array, size);
printf ("Obtained %zd stack frames.\n", size);
for (i = 0; i < size; i++)
printf ("%s\n", strings[i]);
free (strings);
}
打印出来的是代码指针,需要用gdb解释到对应实际函数
I/tvos ( 1084): frame 7 – /applications/bin/tvos() [0xec104]
I/tvos ( 1084): frame 8 – /applications/bin/tvos() [0xdf950]
I/tvos ( 1084): frame 9 – /applications/bin/tvos() [0xe0128]
下面是mstar android方案的一些相关路径,仅作参考
adb工具:/opt/msd828/arm-2012.09/bin/arm-none-linux-gnueabi-gdb
要解释的文件:/supernova/projects/symbols/applications/bin/tvos
实际执行(在supernova路径下):
/opt/msd828/arm-2012.09/bin/arm-none-linux-gnueabi-gdb projects/symbols/applications/bin/tvos
解释完出来的是:
(gdb) info line *0xe0128
Line 299 of “…/…/…/src/binder/Parcel.cpp” starts at address 0xe0128 <android::Parcel::data() const> and ends at 0xe0130 <android::Parcel::dataSize() const>.
addr2line 使用也类似上面:
/opt/msd828/arm-2012.09/bin/arm-none-linux-gnueabi-addr2line -e projects/symbols/applications/bin/tvos 0xe0128
方法2
一、在需要加堆栈的文件(*.cpp)里
#if defined(ENABLE_MBACKTRACE) && (ENABLE_MBACKTRACE == 1)
#include "MBacktrace.h"
#endif
二、查找调用函数(此cpp的某个函数某个位置)
#if defined(ENABLE_MBACKTRACE) && (ENABLE_MBACKTRACE == 1)
enableBacktrace(MAPI_TRUE);
printBacktrace(0);
enableBacktrace(MAPI_FALSE);
#endif
三、放在需要加堆栈的路径最近的Makefile文件里
ifeq ($(ENABLE_MBACKTRACE), 1)
INCS += -I$(INCLUDE_PATH)/MBacktrace
endif
java层加堆栈打印
Log.d(TAG, Log.getStackTraceString(new Throwable()));