博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
breakpad的学习与使用笔记
阅读量:4030 次
发布时间:2019-05-24

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

TIPS总结

使用AS自带的minidump_stackwalk

不一定要下载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

各个平台下编译的dump_syms只能处理各个平台的库的符号

breakpad 是跨平台的,支持linux、window和Mac os系统,不同平台上的编译配置也是不同的

  • linux 平台编译出来的dump_syms 仅能再linux上运行,来处理该平台的动态库(*.so)和符号信息
  • macOS 平台编译出来的dump_syms 仅能再mac OS 上运行,来处理该平台的动态库(*.dylib)的符号信息
  • window 平台编译出来的dump_syms,仅能在Window上运行,来处理该平台的动态库(*.dll)的符号信息
    如果在macOS使用dump_sym对动态库so文件,生成调试信息,为提示如下出错信息
file is neither a fat binary file nor a Mach-O object file

minidump_stackwalk + addr2line

使用minidump_stackwalk读取minidump文件时没有dump_sysms生成的调试符号信息时,输出的崩溃堆栈会缺少函数符号和行号等信息,此时如果我们有对应的so的带有调试信息版本的so( 即with debug_info, not stripped的版本),我们就可以用addr2line等命令行工具去手动的解析地址对应的函数名和行号了

有关 debug identifier

在这里插入图片描述

在这里插入图片描述
关键的代码是file_id.cc下的FileID::ConvertIdentifierToUUIDString跟FileID::ElfFileIdentifierFromMappedFile这两个方法,debug identifiers的值在非PDB格式下是读取so的build_id的值,如果没有build_id就读取so代码段的前面部份字节的值,然后对读取后的值转为UUID的格式

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

有关于breakpad

//TODO

有关于崩溃日志分析

//TODO

参考文章

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

你可能感兴趣的文章
深度学习库提供了什么?
查看>>
Theano中如何只更新一部分权重,用法及理由。
查看>>
深度学习实践
查看>>
机器学习探索性数据分析的数据类型
查看>>
机器学习探索性数据分析的数据类型(补充)
查看>>
机器学习中典型工作流程
查看>>
数据挖掘十大算法 and 算法概述
查看>>
机器学习中样本数据预处理
查看>>
机器学习中样本缺失值的处理方法
查看>>
机器学习中样本比例不平衡的处理方法
查看>>
机器学习中的文本处理
查看>>
K近邻分类
查看>>
Java集合
查看>>
Java泛型、反射、注解、Lambda表达式
查看>>
Spring框架入门
查看>>
Linear Regression及各种线型回归在正则化中的应用
查看>>
朴素贝叶斯算法
查看>>
逻辑回归
查看>>
感知机 - 支持向量机
查看>>
决策树算法(ID3、C4.5、CART)
查看>>