zoukankan      html  css  js  c++  java
  • Google Breakpad之七,android平台简明用法

    google breakpad android简易使用方法:
    breakpad是一个跨平台的c++崩溃处理系统。
    包括:dmp生成模块、 上传模块、 服务器存储模块、解析dmp模块 等。

    初级只使用dmp生成模块,再加上手动分析dmp即可。
    1、编译静态库
    解压并拷贝breakpad源码目录到项目中,编译:
    ./configure --host=arm-linux-androideabi
    make -j2

    生成的库是:
    src/client/linux/libbreakpad_client.a

    2、源码中include头文件:
    #include "client/linux/handler/exception_handler.h"
    然后在源码中加入:
    #ifdef USE_DUMP
    #ifdef __linux__//下面是linux下的声明方法,其他平台有所不同
     google_breakpad::MinidumpDescriptor descriptor("/");//dmp生成的目录
     google_breakpad::ExceptionHandler eh(descriptor,
      NULL,
      NULL,
      NULL,
      true,
      -1);
    #endif
    #endif

    ExceptionHandler的变量eh在作用域内有效。
    比如在main的最开始就加上这两行,那么在整个程序生命周期的异常crash皆可被捕获。

    3、修改Android.mk文件,通过USE_DUMP宏可控制是否生成带breakpad的项目版本

    确保Application.mk里有APP_STL设置,STLport 或者 GNU libstdc++,然后
    在   LOCAL_CFLAGS += \
    最后加上一行-DUSE_DUMP
    比如:
       LOCAL_CFLAGS += \
          -DANDROID_SDK \
          -DUSE_DUMP

    在LOCAL_STATIC_LIBRARIES := \
    代码块后加上一行:

    LOCAL_STATIC_LIBRARIES += breakpad_client

    在mk文件末尾加上:
    include ./jni/src/common/breakpad/android/google_breakpad/Android.mk

    4、编译项目文件
    ndk-build
    注意obj文件夹里的项目文件是带符号信息的,lib文件夹里的不带,
    所以cp出obj里的文件,部署到测试环境,程序死掉时会生成dmp文件。


    5、dmp文件解析

    把src/processor/minidump_stackwalk用adb push 到android设备上,比如/目录,然后chmod一下
    src/tools/linux/dump_syms/dump_syms同上
    解析dmp文件,比如test是我的项目文件,5ee28168-f798-caba-749b962b-312eaf19.dmp 是挂掉后的dmp文件
    ./dump_syms ./test > test.sym
    busybox head -n1 test.sym
    屏幕显示:
    MODULE Linux arm 6EDC6ACDB282125843FD59DA9C81BD830 test
    然后:
    mkdir -p ./symbols/test/6EDC6ACDB282125843FD59DA9C81BD830
    mv test.sym ./symbols/test/6EDC6ACDB282125843FD59DA9C81BD830
    ./minidump_stackwalk 5ee28168-f798-caba-749b962b-312eaf19.dmp ./symbols

    屏幕显示堆栈信息:
    Operating system: Linux
                       0.0.0 Linux 2.6.32-279.11.1.el6.x86_64 #1 SMP Tue Oct 16 15:57:10 UTC 2012 x86_64
     CPU: amd64
          family 6 model 42 stepping 7
          1 CPU

    Crash reason:  SIGSEGV//挂掉类型
    Crash address: 0x0

    Thread 0 (crashed)//挂掉线程id
      0  test!crash() [test.cc : 10 + 0x4]//代码:   *a = 1; //a是一个int*的指针,值为NULL,给NULL赋值1,挂在源码的第10行,从左到右第四个字符的位置挂了,即a。
        rbx = 0x00007fff6c4b8a90   r12 = 0x0000000000401a00
         r13 = 0x00007fff6c4b8bc0   r14 = 0x0000000000000000
         r15 = 0x0000000000000000   rip = 0x0000000000401b2d
         rsp = 0x00007fff6c4b89e0   rbp = 0x00007fff6c4b89e0
         Found by: given as instruction pointer in context
      1  test!main [test.cc : 16 + 0x4]
         rbx = 0x00007fff6c4b8a90   r12 = 0x0000000000401a00
         r13 = 0x00007fff6c4b8bc0   r14 = 0x0000000000000000
         r15 = 0x0000000000000000   rip = 0x0000000000401c29
         rsp = 0x00007fff6c4b89f0   rbp = 0x00007fff6c4b8ae0
         Found by: call frame info
      2  libc-2.12.so + 0x1ecdc
         rbx = 0x0000000000000000   r12 = 0x0000000000401a00
         r13 = 0x00007fff6c4b8bc0   r14 = 0x0000000000000000
         r15 = 0x0000000000000000   rip = 0x0000003d64e1ecdd
         rsp = 0x00007fff6c4b8af0   rbp = 0x0000000000000000
         Found by: call frame info
      3  test!crash() [test.cc : 11 + 0x1]
         rip = 0x0000000000401b35   rsp = 0x00007fff6c4b8b10
         Found by: stack scanning

    Loaded modules:
     0x00400000 - 0x00412fff  test  ???  (main)
     0x3d64a00000 - 0x3d64a1ffff  ld-2.12.so  ???
     0x3d64e00000 - 0x3d6518dfff  libc-2.12.so  ???
     0x3d65600000 - 0x3d65818fff  libpthread-2.12.so  ???
     0x3d65a00000 - 0x3d65c83fff  libm-2.12.so  ???
     0x3d6a600000 - 0x3d6a815fff  libgcc_s-4.4.6-20120305.so.1  ???
     0x3d6c600000 - 0x3d6c8f0fff  libstdc++.so.6.0.13  ???
     0x7fff6c4f9000 - 0x7fff6c4f9fff  linux-gate.so  ???

  • 相关阅读:
    ssh框架构建项目详解--基本概念和struts2
    maven 工程启动找不到 Spring ContextLoaderListener 的解决办法
    ssh(struts,spring,hibernate)开发的初步集成02--xml文件配置
    ssh(struts,spring,hibernate)开发的初步集成01--依赖
    Maven--01(概念)
    hibernate入门知识-03-对象关系映射
    [LeetCode]Construct Binary Tree from Preorder and Inorder Traversal
    [LeetCode]Plus One
    [LeetCode]Triangle
    [LeetCode]PASCAL Triangle系列
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/2995081.html
Copyright © 2011-2022 走看看