Android&iOS崩溃堆栈上报

原文地址:http://www.cnblogs.com/songcf/p/4885468.html

通过崩溃捕获和收集,可以收集到已发布应用(游戏)的异常,以便开发人员发现和修改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在百度上能查出很多总不同的实现,这里贴出一篇我用过并成功编译运行的实现方式的帖子:http://stackoverflow.com/questions/8115192/android-ndk-getting-the-backtrace
但是该方式如果是在收到signal的回调函数中使用,是不能还原崩溃堆栈的,只能得到signal发出后到调用unwind之间的函数堆栈,而我们需要的是signal发出前的崩溃堆栈

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

这里有篇不错的博客:http://hutaow.com/blog/2013/10/15/dump-stack/ 不过我在测试时,汇编代码ndk编译不过,一直没解决,所以并没有采用该方法。
后来又找到了一篇不错的文章,可以结合着看:http://blog.chinaunix.net/uid-24774106-id-3457205.html

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

在收到信号时通过jni回调java端,通过新开一个进程获取logcat来得到崩溃堆栈,但此时并未得到c++的崩溃堆栈,该方法源自:
http://stackoverflow.com/questions/8115192/android-ndk-getting-the-backtrace#
http://www.cnblogs.com/lancidie/archive/2013/04/13/3019349.html

6)使用第三发sdk

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


关于符号表的原理推荐看这本书:
《Linkers and Loaders》——John Levine


Android&iOS崩溃堆栈上报的更多相关文章

  1. 转: iOS崩溃堆栈符号表使用与用途

    转:http://bugly.qq.com/blog/?p=119 iOS崩溃堆栈符号化,定位问题分分钟搞定! 2015.3.16 腾讯Bugly 微信分享   最近一段时间,在跟开发者沟通过程中,萝 ...

  2. 如何用ndk-stack察看android崩溃堆栈

    前提:要打开eclipse的LogCat窗口 1.保存log,先要选中eclipse的LogCat的所有行,点击保存,假设保存到了/User/mac/Desktop/log.txt 2.找到你的so( ...

  3. 常用获取Android崩溃日志和IOS崩溃日志的几种方法

    一:前言 在日常测试app时,经常会遇到崩溃问题,测试快速抓取到崩溃日志可以有效方便开发进行定位,快速解决问题所在测试做到测试分析,定位是非常重要的,这也是判断一个测试能力指标的一大维度. 二:And ...

  4. iOS 日志自动上报

       您好,欢迎使用腾讯Bugly!腾讯Bugly是腾讯公司为移动开发者开放的服务之一. 针对移动应用,腾讯Bugly提供了专业的Crash(崩溃).Android ANR(application n ...

  5. iOS崩溃治理--开篇

    去年我开始负责iOS崩溃治理的工作,从原来的万分之五崩溃率,一直到现在的万分之一左右的崩溃率,期间踩了很多坑,因此想和大家分享一下,希望能对大家有所帮助,也欢迎大家私信交流. 如果你打算开始治理崩溃的 ...

  6. iOS崩溃调试的使用和技巧总结

    在iOS开发调试过程中以及上线之后,程序经常会出现崩溃的问题.简单的崩溃还好说,复杂的崩溃就需要我们通过解析Crash文件来分析了,解析Crash文件在iOS开发中是比较常见的. 现在网上有很多关于解 ...

  7. windows phone和android,ios的touch事件兼容

    1.开发背景 最近用html5写了个小游戏,中间踩过无数坑,有很多甚至百度都百度不到答案,可见html5还真是不成熟,兼容性的复杂度比ie6有过之而无不及,性能那个渣简直无力吐槽.. 好了,吐槽结束, ...

  8. android app崩溃日志收集以及上传

    源代码获取请到github:https://github.com/DrJia/AndroidLogCollector 已经做成sdk的形式,源代码已公开,源代码看不懂的请自行google. 假设想定制 ...

  9. iOS崩溃日志ips文件解析

    iOS崩溃日志ips文件解析  一 简介 测试组的同事在进行稳定性测试时,通常会遇到一些崩溃,然后他们会将这些崩溃日志(一般是ips格式的文件)反馈给开发进行分析,但是这些ips文件中的内容通常是如下 ...

随机推荐

  1. Codeforces 597C. Subsequences (树状数组+dp)

    题目链接:http://codeforces.com/contest/597/problem/C 给你n和数(1~n各不同),问你长为k+1的上升自序列有多少. dp[i][j] 表示末尾数字为i 长 ...

  2. webbench压力测试

    webbench最多可以模拟3w多个并发请求去测试网站负载能力. 一:获取webbench工具,安装编译: wget http://blog.zyan.cc/soft/linux/webbench/w ...

  3. Eclipse设置、调优、使用

    eclipse调优 一般在不对eclipse进行相关设置的时候,使用eclipse总是会觉得启动好慢,用起来好卡,其实只要对eclipse的相关参数进行一些配置,就会有很大的改善. 加快启动速度 1. ...

  4. ASP.NET MVC- KindEditor的使用

    我用过几个EDITOR,还是比较喜欢KINDEDITOR.这个工作可能最近要用到了,周末在家花时间了解了一下.做了一下备注在这里,以备日后方便查阅. 1.首先去KINDEDITOR的官网下载最新的版本 ...

  5. android 开源 + 一些素材网站

    ui 设计工具:http://www.sketchcn.com/ 分类汇总: https://github.com/Trinea/android-open-project 直接拿来用!最火的Andro ...

  6. Http下的各种操作类.WebApi系列~通过HttpClient来调用Web Api接口

    1.WebApi系列~通过HttpClient来调用Web Api接口 http://www.cnblogs.com/lori/p/4045413.html HttpClient使用详解(java版本 ...

  7. PHP安装环境,服务器不支持curl_exec的解决办法

    转自:http://jingyan.baidu.com/article/00a07f38909c6b82d028dc83.html windows下开启方法: 拷贝PHP目录中的libeay32.dl ...

  8. 使用 Protocol Buffers 代替 JSON 的五个原因

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  9. PostgreSQL中的AnyArray例子

    http://www.joeconway.com/presentations/function_basics.pdf CREATE FUNCTION myappend(anyarray, anyele ...

  10. 【java开发系列】— JDOM创建、改动、删除、读取XML文件

    有非常多中操作XML文件的方法,这里介绍一下JDOM的用法和技巧. JDOM下载地址 创建XML文档 XML文件是一种典型的树形文件,每一个文档元素都是一个document元素的子节点. 而每一个子元 ...