博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android&iOS崩溃堆栈上报
阅读量:6086 次
发布时间:2019-06-20

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

Android&iOS崩溃堆栈上报

原文地址:

通过崩溃捕获和收集,可以收集到已发布应用(游戏)的异常,以便开发人员发现和修改bug,对于提高软件质量有着极大的帮助。在这里总结一下这几天做崩溃捕获的收获。


我们项目使用的是cocos2dx-js,那么要捕获的信息就有以下三点:

  1. js脚本语法错误、js调用为定义的native对象(程序不会崩溃)
  2. iOS(obj-c)/Android(java)端的未捕获异常导致的crash
  3. c++操作时导致的crash

1. js端错误

js端的错误,都会调用2dx的ScriptingCore::reportError方法打印日志,在该方法内获取错误并上报即可。


2. iOS(obj-c)/Android(java)的未捕获异常

iOS/Android都可以在程序的入口处设置未捕获异常的捕获

  • iOS : NSSetUncaughtExceptionHandler(&HandleException);
  • Android : Thread.setDefaultUncaughtExceptionHandler(handler);
    在回调中获取堆栈信息上报即可。

3. c++层操作时导致crash

c++操作错误导致crash时,无论是iOS还是android系统,其底层都是unix或者是类unix系统,可以通过信号机制来捕获(signal或者是sigaction),即任何系统错误都会抛出一个错误信号,我们可以通过设定一个回调函数,然后在回调函数里面打印并发送错误日志,而我在接入时,主要的难点在Android平台。

下面列举一些我尝试过的,获取c/c++函数调用堆栈的方法

1)使用CallStack工具类

头文件位于frameworks/native/include/utils/CallStack.h,在Android的C++中,已经集成了工具类CallStack,在libutils.so中。此方法不适用NDK,对于2dx来说,如果想要使用该工具类需要下载android源码,然后在ndk的工程中添加依赖;或者使用dlopen/dlsym动态获得函数句柄实现调用(该方法不知可行否,还没来得及测试)

2)使用execinfo.h

glibc头文件"execinfo.h"中的backtrace、backtrace_symbols接口是linux下常用的获取堆栈的方式,但是该方法不适用于android,因为android适用的是bionic,而非glibc。

3)使用unwind_backtrace

使用unwind在百度上能查出很多总不同的实现,这里贴出一篇我用过并成功编译运行的实现方式的帖子:

但是该方式如果是在收到signal的回调函数中使用,是不能还原崩溃堆栈的,只能得到signal发出后到调用unwind之间的函数堆栈,而我们需要的是signal发出前的崩溃堆栈

4)通过函数调用原理,自己实现获取函数栈的方法

这里有篇不错的博客: 不过我在测试时,汇编代码ndk编译不过,一直没解决,所以并没有采用该方法。

后来又找到了一篇不错的文章,可以结合着看:

5)android平台通过logcat获取崩溃堆栈

在收到信号时通过jni回调java端,通过新开一个进程获取logcat来得到崩溃堆栈,但此时并未得到c++的崩溃堆栈,该方法源自:

6)使用第三发sdk

使用第三方sdk很方便,而且在后台浏览crash信息也很清晰,这里推荐一下我用的tencent-bugly,如果你在使用之前不清楚获取崩溃堆栈的原理,看看前面几点提到的文章和方法会收益颇多


关于符号表的原理推荐看这本书:

《Linkers and Loaders》——John Levine


转载于:https://www.cnblogs.com/songcf/p/4885468.html

你可能感兴趣的文章
AVX2整数向量运算
查看>>
POJ2559 HDU1506 ZOJ1985 Largest Rectangle in a Histogram【堆栈】
查看>>
POJ NOI0105-41 数字统计
查看>>
各类电压标准
查看>>
Yii2 提供可以用属性的方式去获取类的一个方法
查看>>
安装Jenkins(基于Ubuntu Desktop 12.04 LTS)
查看>>
c++复习总结
查看>>
Cow Uncle 学习了叉积的一点运用,叉积真的不错
查看>>
caffe源码 池化层 反向传播
查看>>
scikit-learn包的学习资料
查看>>
安卓开发学习笔记—————《第一行代码》第四章 探究碎片 (Fragment和RecyclerView实践)...
查看>>
异步与并行~CancellationTokenSource对线程的作用
查看>>
C#~异步编程再续~你必须要知道的ThreadPool里的throw
查看>>
Lind.DDD.UoW~方法回调完成原子化操作
查看>>
需求分析
查看>>
JS _函数作用域及变量提升
查看>>
SharePoint 2010 动态创建calculate column
查看>>
iOS程序员 如何做到升职加薪,5年 开发经验 码农 笔记送给你!
查看>>
win7电脑关机时间长怎么办
查看>>
MySQL配置文件mysql.ini参数详解
查看>>