Breakpad工具下载,make

  1. 下载breakpad 源码,下载ssl包到 breakpad源码的third_party中去。需要翻墙

    git clone https://chromium.googlesource.com/linux-syscall-support
    复制代码
  2. 到源码下面编译,然后生成工具 dump_sys, minidump_stackwalk.(在src/processor下面)

./configure && make
make install
复制代码

项目引用Breakpad工程

  1. 搭建module,导入breakpad源码,配置CMakeLists.txt

    cmake_minimum_required(VERSION 3.4.1)set(BREAKPAD_ROOT ${CMAKE_CURRENT_SOURCE_DIR})
    
    include_directories(${BREAKPAD_ROOT}/src ${BREAKPAD_ROOT}/src/common/android/include)file(GLOB BREAKPAD_SOURCES_COMMON${BREAKPAD_ROOT}/src/client/linux/crash_generation/crash_generation_client.cc${BREAKPAD_ROOT}/src/client/linux/dump_writer_common/thread_info.cc${BREAKPAD_ROOT}/src/client/linux/dump_writer_common/ucontext_reader.cc${BREAKPAD_ROOT}/src/client/linux/handler/exception_handler.cc${BREAKPAD_ROOT}/src/client/linux/handler/minidump_descriptor.cc${BREAKPAD_ROOT}/src/client/linux/log/log.cc${BREAKPAD_ROOT}/src/client/linux/microdump_writer/microdump_writer.cc${BREAKPAD_ROOT}/src/client/linux/minidump_writer/linux_dumper.cc${BREAKPAD_ROOT}/src/client/linux/minidump_writer/linux_ptrace_dumper.cc${BREAKPAD_ROOT}/src/client/linux/minidump_writer/minidump_writer.cc${BREAKPAD_ROOT}/src/client/minidump_file_writer.cc${BREAKPAD_ROOT}/src/common/convert_UTF.c${BREAKPAD_ROOT}/src/common/md5.cc${BREAKPAD_ROOT}/src/common/string_conversion.cc${BREAKPAD_ROOT}/src/common/linux/elfutils.cc${BREAKPAD_ROOT}/src/common/linux/file_id.cc${BREAKPAD_ROOT}/src/common/linux/guid_creator.cc${BREAKPAD_ROOT}/src/common/linux/linux_libc_support.cc${BREAKPAD_ROOT}/src/common/linux/memory_mapped_file.cc${BREAKPAD_ROOT}/src/common/linux/safe_readlink.cc)file(GLOB BREAKPAD_ASM_SOURCE ${BREAKPAD_ROOT}/src/common/android/breakpad_getcontext.S)
    
    set_source_files_properties(${BREAKPAD_ASM_SOURCE} PROPERTIES LANGUAGE C)add_library(breakpad STATIC ${BREAKPAD_SOURCES_COMMON} ${BREAKPAD_ASM_SOURCE})target_link_libraries(breakpad log)
    复制代码
  2. 初始化 Breakpad库

    public class BreakpadInit {static {System.loadLibrary("breakpad-core");}public static void initBreakpad(String path){initBreakpadNative(path);}private static native void initBreakpadNative(String path);
    }
    复制代码

native:

bool DumpCallback(const google_breakpad::MinidumpDescriptor &descriptor,void *context,bool succeeded) {ALOGD("===============crrrrash================");ALOGD("Dump path: %s\n", descriptor.path());return succeeded;
}extern "C"
JNIEXPORT void JNICALL
Java_com_sample_breakpad_BreakpadInit_initBreakpadNative(JNIEnv *env, jclass type, jstring path_) {const char *path = env->GetStringUTFChars(path_, 0);google_breakpad::MinidumpDescriptor descriptor(path);static google_breakpad::ExceptionHandler eh(descriptor, NULL, DumpCallback, NULL, true, -1);env->ReleaseStringUTFChars(path_, path);
}JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) {JNIEnv *env;if (vm->GetEnv((void **) &env, JNI_VERSION_1_6) != JNI_OK) {return JNI_ERR;}return JNI_VERSION_1_6;
}
复制代码
  1. 项目工程中,把奔溃写入到sdcard里:

     /*** 一般来说,crash捕获初始化都会放到Application中,这里主要是为了大家有机会可以把崩溃文件输         *出到sdcard中做进一步的分析*/private void initBreakPad() {if (externalReportPath == null) {externalReportPath = new File(getFilesDir(), "crashDump");if (!externalReportPath.exists()) {externalReportPath.mkdirs();}}BreakpadInit.initBreakpad(externalReportPath.getAbsolutePath());}@Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);initExternalReportPath();}private void initExternalReportPath() {externalReportPath = new File(Environment.getExternalStorageDirectory(), "crashDump");if (!externalReportPath.exists()) {externalReportPath.mkdirs();}}
    复制代码

分析

1.将sdcard中保存下来的crashDump的文件保存到本地:

$:> adb pull /sdcard/crashDump  /Users/***/Desktop
复制代码
  1. 首先把dump文件转化成text文件,采用的工具是Breakpad中的minidump工具。
./tools/mac/minidump_stackwalk crashDump/***.dmp >crashLog.txt
复制代码
  1. 打开text文件看到详细的crash日志,如下

    Operating system: Android0.0.0 Linux 3.4.0-g7717f76 #1 SMP PREEMPT Wed Nov 4 21:42:24 UTC 2015 armv7l
    CPU: armARMv7 Qualcomm Krait features: swp,half,thumb,fastmult,vfpv2,edsp,neon,vfpv3,tls,vfpv4,idiva,idivt4 CPUsGPU: UNKNOWN
    Crash reason:  SIGSEGV /SEGV_MAPERR
    Crash address: 0x0
    Process uptime: not availableThread 0 (crashed)//crash 发生时候的线程0  libcrash-lib.so + 0x76e//发生 crash 的位置和寄存器信息r0 = 0x00000000    r1 = 0x00000001    r2 = 0xbea9b1fc    r3 = 0xb4d96a80r4 = 0x6f94d378    r5 = 0x12c0ec00    r6 = 0x12dca6a0    r7 = 0xbea9b1e8r8 = 0x12d63680    r9 = 0xb4db6500   r10 = 0x12d0bf20   r12 = 0xb3b1afd8fp = 0x00000000    sp = 0xbea9b1d4    lr = 0xb3b1778b    pc = 0xb3b1776eFound by: given as instruction pointer in context1  dalvik-main space (deleted) + 0x1cf0desp = 0xbea9b1ec    pc = 0x12dcf0e0Found by: stack scanning2  base.odex + 0x441137sp = 0xbea9b1f0    pc = 0xa2159139Found by: stack scanning3  dalvik-LinearAlloc (deleted) + 0x8baesp = 0xbea9b1f4    pc = 0xb0732bb0Found by: stack scanning4  dalvik-main space (deleted) + 0x5397esp = 0xbea9b200    pc = 0x12c53980Found by: stack scanning5  dalvik-main space (deleted) + 0xebfesp = 0xbea9b248    pc = 0x12c0ec00Found by: stack scanning6  dalvik-main space (deleted) + 0x1ca69esp = 0xbea9b24c    pc = 0x12dca6a0Found by: stack scanning7  dalvik-main space (deleted) + 0x1cf0desp = 0xbea9b250    pc = 0x12dcf0e0Found by: stack scanning8  dalvik-main space (deleted) + 0x16367esp = 0xbea9b254    pc = 0x12d63680Found by: stack scanning9  dalvik-main space (deleted) + 0x10bf1esp = 0xbea9b258    pc = 0x12d0bf20Found by: stack scanning
    10  base.odex + 0x440cb5sp = 0xbea9b260    pc = 0xa2158cb7Found by: stack scanning
    复制代码
  2. 符号解析,可以使用 ndk 中提供的addr2line来根据地址进行一个符号反解的过程,该工具在$NDK_HOME/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-addr2line

注意:此处要注意一下平台,如果是 arm64位的 so,解析是需要使用 aarch64-linux-android-4.9下的工具链

xiuchengdeMBP:crashDump xiuchengyin$ /Users/xiuchengyin/Library/Android/sdk/ndk-bundle/toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64/bin/aarch64-linux-android-addr2line -f -C -e libcrash-lib.so 0x76e
Crash()
/Users/xiuchengyin/Documents/AndroidJK/Chapter01/sample/src/main/cpp/crash.cpp:10
xiuchengdeMBP:crashDump xiuchengyin$
复制代码

这样就可以看到 具体奔溃的代码行数了。

我只是做个笔记,文章参考:time.geekbang.org/column/arti…

Breakpad Native异常捕获相关推荐

  1. 技术实践第二期|Flutter异常捕获

    简介:应用性能稳定是良好用户体验中非常关键的一环,为了更好保障应用性能稳定,异常捕获在保证线上产品稳定中扮演着至关重要的角色.我们团队在推出了U-APM移动应用性能监控的产品后,帮助开发者定位并解决掉 ...

  2. 关于ANR异常捕获与分析,你所需要知道的一切

    关于ANR异常捕获与分析,你所需要知道的一切 2017年11月27日 19:48:05 大_熊_ 阅读数:1796 标签: AndroidANRAMSBugly 更多 个人分类: Android 应用 ...

  3. Android 全局异常捕获DefaultUncaughtExceptionHandler与Cockroach

    前言 Android中虽然可以通过设置 Thread.setDefaultUncaughtExceptionHandler来捕获全局的所有线程的异常,但主线程抛出异常时仍旧会导致activity闪退, ...

  4. Spring Boot配置全局异常捕获

    1 SpringBoot配置全局的异常捕获 项目的说明 配置thymeleaf作为视图模板 ExceptionController.java模拟测试用 MyAjaxExceptionHandler.j ...

  5. 简单介绍Go语言错误处理异常捕获+异常抛出

    这篇文章主要介绍了Go语言错误处理异常捕获和异常抛出,Go语言的作者认为java等语言的错误处理底层实现较为复杂,就实现了函数可以返回错误类型以及简单的异常捕获,虽然简单但是也非常精妙,大大的提高了运 ...

  6. 用c实现跨平台异常捕获机制

    为什么80%的码农都做不了架构师?>>>    TBOX封装了一套跨平台的异常捕获实现,来模拟windows的seh异常处理功能,而且是线程安全的. 在linux/mac下的实现 使 ...

  7. python网络编程-异常处理-异常捕获-抛出异常-断言-自定义异常-UDP通信-socketserver模块应用-03

    python网络编程-异常处理-异常捕获-抛出异常-断言-自定义异常-UDP通信-socketserver模块应用-03 参考文章: (1)python网络编程-异常处理-异常捕获-抛出异常-断言-自 ...

  8. Java多层的异常捕获

    Java多层的异常捕获 参考文章: (1)Java多层的异常捕获 (2)https://www.cnblogs.com/somedayLi/p/7847136.html 备忘一下.

  9. ORACLE 存储过程异常捕获并抛出

    ORACLE 存储过程异常捕获并抛出 参考文章: (1)ORACLE 存储过程异常捕获并抛出 (2)https://www.cnblogs.com/wdw31210/p/7009731.html 备忘 ...

  10. SQLServer异常捕获

    SQLServer异常捕获 参考文章: (1)SQLServer异常捕获 (2)https://www.cnblogs.com/OliverQin/p/4994717.html 备忘一下.

最新文章

  1. 多个相机拍摄定位_两种方式拍照易泄露隐私 | 如何避免照片记录 iPhone 定位信息?...
  2. Java中对比两个对象中属性值[反射、注解]
  3. 千万PV级别WEB站点架构设计
  4. (提示)ubuntu16.04通过sealos安装k8s,需要重新部署apply一下calico组件
  5. 复盘二进制的习题(1)
  6. jQuery中append、appendTo、prepend、prependTo、before、insertBefore、after与insertAfter方法注意事项...
  7. 【Spring 】Synchronized锁在Spring事务管理下,为啥还线程不安全?
  8. scala学习-1-eclipse编写第一个程序unknown scala version problem
  9. oracle和Linux能兼容吗,Oracle基于Linux 7下的安装
  10. 2018.11.22 mac中允许所有安装来源的命令 Mac窗口标题显示文件的路径
  11. IO OutputStreamWriter和InputStreamReader
  12. Layui 数据表格:用户个性化定制列(拖拽,隐藏)
  13. 回测系统backtrader(1)参考模板
  14. Freesurfer学习笔记——Introduction to Freesurfer Output(输出简介)
  15. 固态硬盘数据如何恢复
  16. 飞思卡尔智能车一:山外鹰眼摄像头使用原理
  17. 化妆品护肤DiY的广告界面 简单的jquery 图片无缝滚动
  18. 计算机表格行列知识,计算机基础知识——应用表格.ppt
  19. 【论文阅读】TomoAlign: A novel approach to correcting sample motion and 3D CTF in CryoET
  20. 12G大显存,七彩虹在CES发布多款RTX 3060显卡和游戏整机新品

热门文章

  1. 图片不能有透明通道AppStore images can't contain alpha channels or transparencies windows iOS
  2. boost python错误_Ubuntu-链接boost.python-致命错误:找不到pyconfig
  3. 在执行某个行为时,其大脑是否产生了对应的稳定脑神经模式映射?如果存在稳定映射,是否能运用机器学习方法发现未知行为神经回路?
  4. C++ OS 网络 数据库 (面试)
  5. UnicodeDecodeError: 'utf-8' codec can't decode byte 0xcd in position 0: invalid continuation byte
  6. CS231n李飞飞计算机视觉 神经网络训练细节part1上
  7. 【数字图像处理系列五】图像滤波之空间滤波:图像平滑降噪和图像锐化
  8. JAVA设计模式之模板方法模式-场景、例子、深入
  9. 如何通过玩TensorFlow Playground来理解神经网络
  10. 推荐系统-猜你喜欢设计