本文共 2894 字,大约阅读时间需要 9 分钟。
不一定要下载Breakpad的源码去编译才可以使用minidump_staackwalk去读/解析minidump文件的内容和查看崩溃崩溃信息,我们可以使用Android Studio自带的minidump_stackwalk。如在macOS下,minidump_stackwalk的位置如下
# AS安装目录下的bin/lldb/bin下Applications/Android Studio.app/Contents/bin/lldb/bin/minidump_stackwalk
breakpad 是跨平台的,支持linux、window和Mac os系统,不同平台上的编译配置也是不同的
file is neither a fat binary file nor a Mach-O object file
使用minidump_stackwalk读取minidump文件时没有dump_sysms生成的调试符号信息时,输出的崩溃堆栈会缺少函数符号和行号等信息,此时如果我们有对应的so的带有调试信息版本的so( 即with debug_info, not stripped的版本),我们就可以用addr2line等命令行工具去手动的解析地址对应的函数名和行号了
bool FileID::ElfFileIdentifierFromMappedFile(const void* base, wasteful_vector& identifier) { // Look for a build id note first. if (FindElfBuildIDNote(base, identifier)) return true; // Fall back on hashing the first page of the text section. return HashElfTextSection(base, identifier);}// These three functions are not ever called in an unsafe context, so it's OK// to allocate memory and use libc.static string bytes_to_hex_string(const uint8_t* bytes, size_t count) { string result; for (unsigned int idx = 0; idx < count; ++idx) { char buf[3]; snprintf(buf, sizeof(buf), "%02X", bytes[idx]); result.append(buf); } return result;}// staticstring FileID::ConvertIdentifierToUUIDString( const wasteful_vector & identifier) { uint8_t identifier_swapped[kMDGUIDSize] = { 0 }; // Endian-ness swap to match dump processor expectation. memcpy(identifier_swapped, &identifier[0], std::min(kMDGUIDSize, identifier.size())); uint32_t* data1 = reinterpret_cast (identifier_swapped); *data1 = htonl(*data1); uint16_t* data2 = reinterpret_cast (identifier_swapped + 4); *data2 = (*data2); uint16_t* data3 = reinterpret_cast (identifier_swapped + 6); *data3 = htons(*data3); return bytes_to_hex_string(identifier_swapped, kMDGUIDSize);}// staticstring FileID::ConvertIdentifierToString( const wasteful_vector & identifier) { return bytes_to_hex_string(&identifier[0], identifier.size());}
arm-linux-androideabi-addr2line -C -f -e ${SOPATH} ${Address}# -C -f //打印错误行数所在的函数名称# -e //打印错误地址的对应路径及行数# ${SOPATH} //so库路径 # ${Address} //需要转换的堆栈错误信息地址,可以添加多个,但是中间要用空格隔开
//TODO
//TODO
//TODO
转载地址:http://zumbi.baihongyu.com/