博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Backtrace in Android
阅读量:2345 次
发布时间:2019-05-10

本文共 3568 字,大约阅读时间需要 11 分钟。

Backtrace in Android

96 Tsing2015
0.7 2016.02.28 23:03* 字数 33 阅读 2491评论 8喜欢 4
libscorkscrew.so在android 5.0之后已经没有了,之前追踪backtrace的方法已经:
转:

#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  ){        ALOGE("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 : "
"; 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); } ALOGD("%s", line); } free_backtrace_symbols(symbols, count); return result;}

上面这个用法其实会缺几个头文件,到源码里抠出来,可能会有错误,修改下,经测试可以用。

在android5.0之后的做法

#incude "backtrace/Backtrace.h"int btdump(){    void * libbacktrace = dlopen("/system/lib/libbacktrace.so",RTLD_LOCAL);    if(!libbacktrace)    {        return -1;    }    Backtrace* (*create)(int,int,void*);    *(void**) &create = dlsym(libbacktrace,"_ZN9Backtrace6CreateEiiP12BacktraceMap");    if(!create)    {        return -1;    }    Backtrace* t = create(-1,-1,NULL);    if(!t)    {        return -1;    }    int ret = t->Unwind(0);    if(!ret)    {        return -1;    }    int count = t->NumFrames();    printf("Backtrace:\n")    for(i = 0; i < count; i++)    {        std::string line = t->FormatFrameData(i);        print("\t%s",line.c_str());    }    return 0;}

小礼物走一走,来简书关注我

转载地址:http://ivjvb.baihongyu.com/

你可能感兴趣的文章
大学生如何学好Java?过来人给你7点建议
查看>>
过来人的经验:Java实习生在公司里一般都做什么?
查看>>
Java入门基础知识点整理大放送,推荐收藏
查看>>
如何成为月入25k的高级程序员?建议养成这7个习惯
查看>>
学 Java还是Python, 哪个更好找工作?
查看>>
Java基础知识:如何计算Java对象占用内存大小?
查看>>
一份Java程序员的珍藏书单,请您注意查收
查看>>
全宇宙上最全Java基础知识点归纳(建议收藏)
查看>>
这6类人,最适合做程序员!
查看>>
Java入门基础知识点需要学什么?
查看>>
为什么现在Java程序员要求高?看完这些原因你就明白了!
查看>>
有哪些值得推荐的 Java 练手项目?
查看>>
一文看清:Java的核心技术是什么?
查看>>
这10款适合Java开发人员使用的工具,你都掌握了吗?
查看>>
谈谈:如何由浅入深的学习一门编程语言?
查看>>
讨论:程序员薪资凭啥那么高?
查看>>
都2021年了,现在转行搞JAVA还来的及么?
查看>>
为什么这么多人Java基础薄弱?该如何提升?
查看>>
如何成为一名合格的Java程序员?
查看>>
spring框架中5种自动装配模式介绍
查看>>