iOS Crash闪退信息捕获工具类

分享到:

        IOS SDK中提供了一个现成的函数 NSSetUncaughtExceptionHandler 用来做异常处理,但功能非常有限,而引起崩溃的大多数原因如:内存访问错误,重复释放等错误捕获不到,因为这些异常抛出的是Signal,所以必须要专门做Signal处理。工具类的实现源码如下:

头文件

#import <Foundation/Foundation.h>
extern NSString *const UncaughtExceptionHandlerSignalKey;
extern NSString *const SingalExceptionHandlerAddressesKey;
extern NSString *const ExceptionHandlerAddressesKey;
@interface ExceptionHandler : NSObject
+ (void)installExceptionHandler;
+ (NSArray *)backtrace;
@end

实现文件

#import "ExceptionHandler.h"
#include <libkern/OSAtomic.h>
#include <execinfo.h>
NSString *const UncaughtExceptionHandlerSignalKey = @"UncaughtExceptionHandlerSignalKey";
NSString *const SingalExceptionHandlerAddressesKey = @"SingalExceptionHandlerAddressesKey";
NSString *const ExceptionHandlerAddressesKey = @"ExceptionHandlerAddressesKey";
const int32_t _uncaughtExceptionMaximum = 20;
// 系统信号截获处理方法
void signalHandler(int signal);
// 异常截获处理方法
void exceptionHandler(NSException *exception);
void signalHandler(int signal)
{
volatile int32_t _uncaughtExceptionCount = 0;
int32_t exceptionCount = OSAtomicIncrement32(&_uncaughtExceptionCount);
// 如果太多不用处理
if (exceptionCount > _uncaughtExceptionMaximum) {
return;
}
// 获取信息
NSMutableDictionary *userInfo = [NSMutableDictionary dictionaryWithObject:[NSNumber numberWithInt:signal] forKey:UncaughtExceptionHandlerSignalKey];
NSArray *callStack = [ExceptionHandler backtrace];
[userInfo  setObject:callStack  forKey:SingalExceptionHandlerAddressesKey];
// 现在就可以保存信息到本地[]
}
void exceptionHandler(NSException *exception)
{
volatile int32_t _uncaughtExceptionCount = 0;
int32_t exceptionCount = OSAtomicIncrement32(&_uncaughtExceptionCount);
// 如果太多不用处理
if (exceptionCount > _uncaughtExceptionMaximum) {
return;
}
NSArray *callStack = [ExceptionHandler backtrace];
NSMutableDictionary *userInfo =[NSMutableDictionary dictionaryWithDictionary:[exception userInfo]];
[userInfo setObject:callStack forKey:ExceptionHandlerAddressesKey];
NSLog(@"Exception Invoked: %@", userInfo);
// 现在就可以保存信息到本地[]
}
@implementation ExceptionHandler
//获取调用堆栈
+ (NSArray *)backtrace
{
void* callstack[128];
int frames = backtrace(callstack, 128);
char **strs = backtrace_symbols(callstack,frames);
NSMutableArray *backtrace = [NSMutableArray arrayWithCapacity:frames];
for (int i=0;i<frames;i++) {
[backtrace addObject:[NSString stringWithUTF8String:strs[i]]];
}
free(strs);
return backtrace;
}
// 注册崩溃拦截
+ (void)installExceptionHandler
{
NSSetUncaughtExceptionHandler(&exceptionHandler);
signal(SIGHUP, signalHandler);
signal(SIGINT, signalHandler);
signal(SIGQUIT, signalHandler);
signal(SIGABRT, signalHandler);
signal(SIGILL, signalHandler);
signal(SIGSEGV, signalHandler);
signal(SIGFPE, signalHandler);
signal(SIGBUS, signalHandler);
signal(SIGPIPE, signalHandler);
}
@end


昵    称:
验证码:

相关文档:

  • 轻量级的零设置 iOS 图像缓存器:Haneke
    Haneke 是个轻量级的零设置 iOS 图像缓存器。Haneke 可以调整图像和内存以及硬盘的缓存大小。所有的步骤都在后台进行,允许快速响应滚...
  • iOS 下拉刷新实现:YiRefresh
    YiRefresh —— 下拉刷新,大道至简,最简单的网络刷新...
  • UIWebView全解
    UIWebView是iOS内置的浏览器控件,可以浏览网页、打开文档等能够加载html/htm、pdf、docx、txt等格式的文件。 是iOS内置的浏览器控件,可以...
  • iOS开源动画制作框架:LWF
    LWF (Lightweight SWF) 是一个开源框架,用来转换 Adobe Flash 动画适应 iOS 的 UIKit ,HTML 5 ,Cocos2d-x,Unity 等等,这就意味着你可以使用 Adobe Flash...
  • 使用Swift写的label - VMFloatLabel(Swift)
    VMFloatLabel(Swift)是一款使用Swift写的label,所定制的占位字符内同会在输入的时候往上移动。...
  • 支持渐变颜色背景UILabel子类:CRGradientLabel
    CRGradientLabel 是自定义的 UILabel 子类,支持渐变颜色背景。采用Swift开发。...
  • iOS视图动画效果 CPAnimationSequence
    编写iOS视图UIView的动画效果需要很多代码,虽然iOS 4支持块定义,对视图动画的定义减少了不少代码,但语法依旧不好看。CPAnimationSequence...
  • iOS利用ASIHTTPRequest 实现一个简单的登陆验证
    今天给大家带来一个简单的登陆验证,用的是ASIHttpRequest 这个开源类库,使用的方法很简单,从网上下载下来以后,添加到项目中,并添...
  • ios利用josn解析(转载)
    json不必多说了,在手机开发中,客户端和服务器端开发经常使用的数据交互模式。Iphone中利用json传递的数据,可以非常容易的展示到各...
  • SSToolkit - iOS开发常用工具类
    这个开源项目提供了一个iOS类集合,用于解决iOS开发人员在开发过程中常碰到一些问题。这些类包括:SSCollectionView, SSSwitch等。...
  • 25条提高iOS App性能的技巧和诀窍
    当我们开发iOS应用时,好的性能对我们的App来说是很重要的。你的用户也希望如此,但是如果你的app表现的反应迟钝或者很慢也会伤害...
  • iOS 8中创建交互式通知
    iOS 8提供了一个令人兴奋的新API来创建交互式通知(interactive notifications),它能让你在你的应用之外为用户提供额外的功能。我发现网上...
  • IOS之同步请求、异步请求、GET请求、POST请求
    1、同步请求可以从因特网请求数据,一旦发送同步请求,程序将停止用户交互,直至服务器返回数据完成,才可以进行下一步操作, 2...
  • iOS 脸部识别:CLFaceDetectionImagePicker
    CLFaceDetectionImagePicker 是脸部识别 ImagePicker,支持 iPad,iOS 7/8,非常容易使用和自定义,完全使用 Objective-C 编写,没有 OPENCV。...
  • Objective-C开发工具包 ytoolkit
    ytoolkit 是 Objective-C 的一个常用开发工具包,包括: 一个快速的base64编码(纯C,及NSData/NSString的category),可以看项目页面的README和代...
  • ios网络数据处理
    1、同步请求可以从因特网请求数据,一旦发送同步请求,程序将停止用户交互,直至服务器返回数据完成,才可以进行下一步操作, 2...
  • Firefox Sync 的iOS客户端:ios-sync-client
    Firefox Sync 的iOS客户端。可同步Firefox桌面版书签、历史、标签页、自动填写等纪录,还自带智能地址栏(Awesome Bar)功能,可快速查找符...
  • iOS开发之路--微博“更多”页面_IOS
    本文是IOS开发之路系列文章第五篇,主要讲诉了,如何制作微博的更多页面,并附上效果图及源码,需要的朋友可以参考下,希望能有所...
  • iOS 开发者必知的 75 个工具
    iOS 开发者必知的 75 个工具...
  • iOS实现超酷页面切换动画特效
    今天所介绍的主题是关于动画的,在之前的博客中也有用到动画的地方,今天就好好的总结一下iOS开发中常用的动画。说道动画其中有一...