android 下打印 backtrace

Android 下面没有 execinfo.h, 就不能用在 glibc下打印 back trace 方法了。

glic 下打印 back trace 参见:http://blog.csdn.net/span76/article/details/11927551 


我写了下面的方法,供参考:

#include <signal.h>
#include <corkscrew/backtrace.h>
static void pnpDumpNativeStack(int sig)
{
#if defined(HAVE_ANDROID_OS) || (defined(HAVE_ALIEN) && !defined(ALIEN_LIBC))
    const size_t MAX_DEPTH = 32;
    backtrace_frame_t backtrace[MAX_DEPTH];
    ssize_t frames = unwind_backtrace_thread(tid, backtrace, 0, MAX_DEPTH);
    if (frames > 0) {
        backtrace_symbol_t backtrace_symbols[MAX_DEPTH];
        get_backtrace_symbols(backtrace, frames, backtrace_symbols);

        for (size_t i = 0; i < size_t(frames); i++) {
            char line[MAX_BACKTRACE_LINE_LENGTH];
            format_backtrace_line(i, &backtrace[i], &backtrace_symbols[i],
                    line, MAX_BACKTRACE_LINE_LENGTH);
            ALOGE("================== %s\n", line);
        }

        free_backtrace_symbols(backtrace_symbols, frames);
    }
#endif
}

...

void dvmCollectGarbageInternal(const GcSpec* spec)
{

     signal(SIGSEGV, pnpDumpNativeStack);
	 ...

Android 是利用 libcorkscrew 提供的类似 execinfo 中方法获取 backtrace 信息。


遗憾的是,我每次打印都打印不全,比如下面就2条,原因有待查明。

09-30 03:38:49.821 137 137 E dalvikvm: ================== #00 pc 00026edb /../system/lib/libdvm.so
09-30 03:38:49.821 137 137 E dalvikvm: ================== #01 pc 00000400 [vdso]




郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。