您的位置:首页 > 其它

打印堆栈

2016-03-16 09:59 405 查看
kernel:

dump_stack();

java 层

Throwable throwable = new Throwable();     

        Log.w(LOGTAG, Log.getStackTraceString(throwable));

或者

        Log.d(TAG,Log.getStackTraceString(new Throwable()));

c++

#include <utils/CallStack.h>

...

CallStack stack;

stack.update();

stack.dump(); 

android app 获取堆栈

1.修改Android.mk

         LOCAL_LDFLAGS += -ldl

2.调用以下函数

#include <corkscrew/backtrace.h> 

#include <dlfcn.h>

#define MAX_DEPTH                       31  

#define MAX_BACKTRACE_LINE_LENGTH   800  

#define PATH "/system/lib/libcorkscrew.so"  

  

typedef ssize_t (*unwindFn)(backtrace_frame_t*, size_t, size_t);  

typedef void (*unwindSymbFn)(const backtrace_frame_t*, size_t, backtrace_symbol_t*);  

typedef void (*unwindSymbFreeFn)(backtrace_symbol_t*, size_t);  

  

static void *gHandle = NULL;  

  

static int getCallStack(void){  

    ssize_t i = 0;  

    ssize_t result = 0;  

    ssize_t count;  

    backtrace_frame_t mStack[MAX_DEPTH];  

    backtrace_symbol_t symbols[MAX_DEPTH];  

  

    unwindFn unwind_backtrace = NULL;  

    unwindSymbFn get_backtrace_symbols = NULL;  

    unwindSymbFreeFn free_backtrace_symbols = NULL;  

  

    // open the so.  

    if(gHandle == NULL) gHandle = dlopen(PATH, RTLD_NOW);  

  

    // get the interface for unwind and symbol analyse  

    if(gHandle != NULL) unwind_backtrace = (unwindFn)dlsym(gHandle, "unwind_backtrace");  

    if(gHandle != NULL) get_backtrace_symbols = (unwindSymbFn)dlsym(gHandle, "get_backtrace_symbols");  

    if(gHandle != NULL) free_backtrace_symbols = (unwindSymbFreeFn)dlsym(gHandle, "free_backtrace_symbols");  

  

    if(!gHandle ||!unwind_backtrace ||!get_backtrace_symbols || !free_backtrace_symbols  ){  

        LOGD("Error! cannot get unwind info: handle:%p %p %p %p",  

            gHandle, unwind_backtrace, get_backtrace_symbols, free_backtrace_symbols );  

        return result;  

    }  

  

    count= unwind_backtrace(mStack, 1, MAX_DEPTH);  

    get_backtrace_symbols(mStack, count, symbols);  

  

    for (i = 0; i < count; i++) {  

        char line[MAX_BACKTRACE_LINE_LENGTH];  

  

        const char* mapName = symbols[i].map_name ? symbols[i].map_name : "<unknown>";  

        const char* symbolName =symbols[i].demangled_name ? symbols[i].demangled_name : symbols[i].symbol_name;  

        size_t fieldWidth = (MAX_BACKTRACE_LINE_LENGTH - 80) / 2;  

          

        if (symbolName) {  

            uint32_t pc_offset = symbols[i].relative_pc - symbols[i].relative_symbol_addr;  

            if (pc_offset) {  

                snprintf(line, MAX_BACKTRACE_LINE_LENGTH, "#%02d  pc %08x  %.*s (%.*s+%u)",  

                        i, symbols[i].relative_pc, fieldWidth, mapName,  

                        fieldWidth, symbolName, pc_offset);  

            } else {  

                snprintf(line, MAX_BACKTRACE_LINE_LENGTH, "#%02d  pc %08x  %.*s (%.*s)",  

                        i, symbols[i].relative_pc, fieldWidth, mapName,  

                        fieldWidth, symbolName);  

            }  

        } else {  

            snprintf(line, MAX_BACKTRACE_LINE_LENGTH, "#%02d  pc %08x  %.*s",  

                    i, symbols[i].relative_pc, fieldWidth, mapName);  

        }  

  

        LOGD("%s", line);  

    }  

  

    free_backtrace_symbols(symbols, count);  

  

    return result;  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: