android ndk 崩溃捕获(cocos2d-x 之android崩溃捕获)

来源:互联网 发布:电力组态软件 编辑:程序博客网 时间:2024/06/09 23:25
ndk 崩溃捕获 ,我们可以采用

Google Breakpad这个开源库

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

这里我只大概说一下dmp生成模块。

1、编译静态库
解压并拷贝breakpad源码目录到项目中,编译:

脚本如下:

LOCAL_PATH := $(call my-dir)

# Defube the client library module, as a simple static library that
# exports the right include path / linker flags to its users.

include $(CLEAR_VARS)

LOCAL_MODULE := breakpad_client_static
LOCAL_MODULE_FILENAME := breakpad_client

LOCAL_CPP_EXTENSION := .cc

# Breakpad uses inline ARM assembly that requires the library
# to be built in ARM mode. Otherwise, the build will fail with
# cryptic assembler messages like:
#   Compile++ thumb  : google_breakpad_client <= crash_generation_client.cc
#   /tmp/cc8aMSoD.s: Assembler messages:
#   /tmp/cc8aMSoD.s:132: Error: invalid immediate: 288 is out of range
#   /tmp/cc8aMSoD.s:244: Error: invalid immediate: 296 is out of range
LOCAL_ARM_MODE := arm

# List of client source files, directly taken from Makefile.am
LOCAL_SRC_FILES := \
    src/client/linux/crash_generation/crash_generation_client.cc \
    src/client/linux/handler/exception_handler.cc \
    src/client/linux/handler/minidump_descriptor.cc \
    src/client/linux/log/log.cc \
    src/client/linux/minidump_writer/linux_dumper.cc \
    src/client/linux/minidump_writer/linux_ptrace_dumper.cc \
    src/client/linux/minidump_writer/minidump_writer.cc \
    src/client/minidump_file_writer.cc \
    src/common/android/breakpad_getcontext.S \
    src/common/convert_UTF.c \
    src/common/md5.cc src/common/string_conversion.cc \
    src/common/linux/elfutils.cc \
    src/common/linux/file_id.cc \
    src/common/linux/guid_creator.cc \
    src/common/linux/linux_libc_support.cc \
    src/common/linux/memory_mapped_file.cc \
    src/common/linux/safe_readlink.cc

LOCAL_C_INCLUDES        := $(LOCAL_PATH)/src/common/android/include \
                           $(LOCAL_PATH)/src

LOCAL_EXPORT_C_INCLUDES := $(LOCAL_C_INCLUDES)
LOCAL_EXPORT_LDLIBS     := -llog

include $(BUILD_STATIC_LIBRARY)


2、这编译生成的breakpad_client.a文件就可以直接导入我们工程直接使用了

3、在我们工程项目中添加这个库的初始化代码

包含头文件

#include "client/linux/handler/exception_handler.h"
#include "client/linux/handler/minidump_descriptor.h"
#include "client/linux/log/log.h"

void InitCrash()
{
#ifdef ANDROID

    std::string s_strOutPath_Debug = FORMAT("%s/%s") << GetDocumentPath() << "Debug";
    DebugMsg("InitCrashReport: %s\n ", s_strOutPath_Debug.c_str());
   //设置生成dmp的路径
    static google_breakpad::MinidumpDescriptor descriptor(s_strOutPath_Debug);
    static google_breakpad::ExceptionHandler eh(descriptor, NULL, DumpCallback,
        NULL, true, -1);

#endif
}


//dmp回调

bool DumpCallback(const google_breakpad::MinidumpDescriptor& descriptor,
    void* context,
    bool succeeded)
{
        DebugMsg("Dump path: %s\n succeeded:%d", descriptor.path(), succeeded==true?1:0);

        if(!succeeded)
        {
            std::remove(descriptor.path());
        }
        return succeeded;
}

4、生成了dmp我们就要开始怎么去解析呢?

在解析这个4f46eb83-d5e8-91dc-3ba0eec4-20a1eabe.dmp 这样一个dump文件之前,我们要准备dump_syms、minidump_stackwalk这两个文件

这个两个文件怎么生成的,可以下载google_breakpad这个开源代码,到linux环境下进行编译既可以出来,后面我们在解析4f46eb83-d5e8-91dc-3ba0eec4-20a1eabe.dmp这个文件,我们还要保存我们的符号文件例如: 这个里面libzerg.so就是我们要保存的符号文件,后面就是把这些文件准备到一个文件夹下如图:


然后就是按下面的步骤:

adb push E:/android/android-sdk-windows/android-sdk-windows/platform-tools/10000 /data/local/tmp/10000
adb shell
cd /data/local/tmp/10000

chmod 777 libzerg.so
chmod 777 dump_syms
chmod 777 minidump_stackwalk

./dump_syms ./libzerg.so>libzerg.so.sym
busybox head -n1 libzerg.so.sym

注意:E21A4C5B4525F184923BC20F0D8557170这个是通过busybox head -n1 libzerg.so.sym这个命令生成

mkdir symbols
cd symbols
mkdir libzerg.so
cd libzerg.so
mkdir E21A4C5B4525F184923BC20F0D8557170
cd /data/local/tmp/10000
cat libzerg.so.sym> ./symbols/libzerg.so/E21A4C5B4525F184923BC20F0D8557170/libzerg.so.sym

cd /data/local/tmp/10000
mkdir res
./minidump_stackwalk 4f46eb83-d5e8-91dc-3ba0eec4-20a1eabe.dmp ./symbols

执行到这里就会生成:


这样整个崩溃解析就算完成了



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 在外打工孩子上学怎么办 婴儿脸干燥发红怎么办 宝宝脸上红点点怎么办 药流出血量少怎么办 药流喝药第一天发烧了怎么办 药流第一天量很少怎么办 小孩不想吃饭口臭怎么办 晚上上班白天睡不着怎么办 新车刮漆了怎么办 药流出血多怎么办 药流第二天没血怎么办 有异味怎么办%3f 养狗后悔了怎么办 买狗后悔了怎么办 小孩子不想去幼儿园怎么办 小孩子不想上幼儿园怎么办 想当兵视力不够怎么办 当兵裸眼视力差怎么办 去公司报道行李怎么办 报道第一天出糗怎么办 痛经一直想拉屎怎么办 月经第一天痛经怎么办 痛经痛得厉害怎么办 脑子里老是幻想怎么办 绿松石盘玩变黑怎么办 绿松石发乌了怎么办 泡脚泡的脚发黑怎么办 想当兵有纹身怎么办 小孩挨打不会还手怎么办 孩子挨打不敢还手怎么办 武警森林改革新兵怎么办 森林武警新兵后来怎么办 部队训练打死人怎么办? 部队受伤退伍后怎么办 60岁失地养老怎么办 梦遗到被子上怎么办 血管打针打的硬怎么办 征兵彩超不过怎么办? 警卫局退役新兵怎么办 有轻微的肾结石怎么办 部队改制边防义务兵怎么办