Backtrace in Android
96 Tsing2015
0.7 2016.02.28 23:03* 字数 33 阅读 2491评论 8喜欢 4
libscorkscrew.so在android 5.0之后已经没有了,之前追踪backtrace的方法已经:
转:https://www.jianshu.com/p/38dbcc392a67

#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;}

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

更多相关文章

  1. 【30篇突击 android】源码统计 十一
  2. Android ViewModel使用与源码解析
  3. git android 源码 ssl错误, 重新设置即可
  4. Ubuntu 16.04 配置android 源码开发/编译环境
  5. Android 源码里packages里面的结构
  6. 【30篇突击 android】源码统计 十二
  7. 短视频带货源码,解决Dialog 不铺满屏幕问题
  8. 表白程序源码,android

随机推荐

  1. 网络界面Android(安卓)网络连接--Wifi/3G
  2. Android中Intent的显示和隐式使用
  3. Android之WebView优化之路
  4. Android自定义控件一简介
  5. 《第一行代码》学习笔记一
  6. android软键盘的用法总结
  7. Android(安卓)wifi驱动的移植 realtek 81
  8. 每天学习一个Android中的常用框架——12.
  9. Android应用程序框架层和系统运行库层日
  10. Android界面布局的几种常用方式