Backtrace in Android
16lz
2021-01-23
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;}
小礼物走一走,来简书关注我
更多相关文章
- 【30篇突击 android】源码统计 十一
- Android ViewModel使用与源码解析
- git android 源码 ssl错误, 重新设置即可
- Ubuntu 16.04 配置android 源码开发/编译环境
- Android 源码里packages里面的结构
- 【30篇突击 android】源码统计 十二
- 短视频带货源码,解决Dialog 不铺满屏幕问题
- 表白程序源码,android