cpp/java 函数调用栈 堆栈打印方法

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()));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值