//

//  UncaughtExceptionHandler.m

//  UncaughtExceptions

//

//  Created by Matt Gallagher on 2010/05/25.

//  Copyright 2010 Matt Gallagher. All rights reserved.

//

//  Permission is given to use this source code file, free of charge, in any

//  project, commercial or otherwise, entirely at your risk, with the condition

//  that any redistribution (in part or whole) of source code must retain

//  this copyright and permission notice. Attribution in compiled projects is

//  appreciated but not required.

//

#import "YunUncaughtExceptionHandler.h"

#include <libkern/OSAtomic.h>

#include <execinfo.h>

NSString * const YunUncaughtExceptionHandlerSignalExceptionName = @"YunUncaughtExceptionHandlerSignalExceptionName";

NSString * const YunUncaughtExceptionHandlerSignalKey = @"YunUncaughtExceptionHandlerSignalKey";

NSString * const YunUncaughtExceptionHandlerAddressesKey = @"YunUncaughtExceptionHandlerAddressesKey";

volatile int32_t YunUncaughtExceptionCount = 0;

const int32_t YunUncaughtExceptionMaximum = 10;

const NSInteger YunUncaughtExceptionHandlerSkipAddressCount = 4;

const NSInteger YunUncaughtExceptionHandlerReportAddressCount = 5;

@implementation UncaughtExceptionHandler

+ (NSArray *)backtrace

{

void* callstack[128];

int frames = backtrace(callstack, 128);

char **strs = backtrace_symbols(callstack, frames);

int i;

NSMutableArray *backtrace = [NSMutableArray arrayWithCapacity:frames];

for (

i = YunUncaughtExceptionHandlerSkipAddressCount;

i < YunUncaughtExceptionHandlerSkipAddressCount +

YunUncaughtExceptionHandlerReportAddressCount;

i++)

{

[backtrace addObject:[NSString stringWithUTF8String:strs[i]]];

}

free(strs);

return backtrace;

}

- (void)alertView:(UIAlertView *)anAlertView clickedButtonAtIndex:(NSInteger)anIndex

{

if (anIndex == 0)

{

dismissed = YES;

}

}

- (void)validateAndSaveCriticalApplicationData

{

}

//错误日志开始发送到服务器

- (void)handleException:(NSException *)exception

{

[self validateAndSaveCriticalApplicationData];

// UIAlertView *alert =

// [[[UIAlertView alloc]

// initWithTitle:NSLocalizedString(@"Unhandled exception", nil)

// message:[NSString stringWithFormat:NSLocalizedString(

// @"You can try to continue but the application may be unstable.\n\n"

// @"Debug details follow:\n%@\n%@", nil),

// [exception reason],

// [[exception userInfo] objectForKey:YunUncaughtExceptionHandlerAddressesKey]]

// delegate:self

// cancelButtonTitle:NSLocalizedString(@"Quit", nil)

// otherButtonTitles:NSLocalizedString(@"Continue", nil), nil]

// autorelease];

// [alert show];

NSString *errorStr = [NSString stringWithFormat:NSLocalizedString(

@"error info details follow:%@%@", nil),

[exception reason],

[[exception userInfo] objectForKey:YunUncaughtExceptionHandlerAddressesKey]]

;

NSLog(@"errorStrerrorStr:%@",errorStr);

// [[NSUserDefaults standardUserDefaults]setObject:errorStr forKey:my_ExceptionLog];

if(errorStr)

{

[self sendErrorMsg];

}

//NSLog(@"error:%@",errorStr);

CFRunLoopRef runLoop = CFRunLoopGetCurrent();

CFArrayRef allModes = CFRunLoopCopyAllModes(runLoop);

while (!dismissed)

{

for (NSString *mode in (__bridge  NSArray *)allModes)

{

CFRunLoopRunInMode((__bridge CFStringRef)mode, 0.001, false);

}

}

CFRelease(allModes);

NSSetUncaughtExceptionHandler(NULL);

signal(SIGABRT, SIG_DFL);

signal(SIGILL, SIG_DFL);

signal(SIGSEGV, SIG_DFL);

signal(SIGFPE, SIG_DFL);

signal(SIGBUS, SIG_DFL);

signal(SIGPIPE, SIG_DFL);

if ([[exception name] isEqual:YunUncaughtExceptionHandlerSignalExceptionName])

{

kill(getpid(), [[[exception userInfo] objectForKey:YunUncaughtExceptionHandlerSignalKey] intValue]);

}

else

{

[exception raise];

}

}

-(void)sendErrorMsg

{

NSLog(@"exceppppppp");

// FetchQueue *fetchQueue = [[FetchQueue alloc]init];

//    [fetchQueue setGLDelegate:self.gldelegate];

//[fetchQueue SendHTTpToGLServer:my_EXCEPT sendType:@"POST"];

}

@end

void HandleException(NSException *exception)

{

int32_t exceptionCount = OSAtomicIncrement32(&YunUncaughtExceptionCount);

if (exceptionCount > YunUncaughtExceptionMaximum)

{

return;

}

NSArray *callStack = [UncaughtExceptionHandler backtrace];

NSMutableDictionary *userInfo =

[NSMutableDictionary dictionaryWithDictionary:[exception userInfo]];

[userInfo

setObject:callStack

forKey:YunUncaughtExceptionHandlerAddressesKey];

[[[UncaughtExceptionHandler alloc] init]

performSelectorOnMainThread:@selector(handleException:)

withObject:

[NSException

exceptionWithName:[exception name]

reason:[exception reason]

userInfo:userInfo]

waitUntilDone:YES];

}

void SignalHandler(int signal)

{

int32_t exceptionCount = OSAtomicIncrement32(&YunUncaughtExceptionCount);

if (exceptionCount > YunUncaughtExceptionMaximum)

{

return;

}

NSMutableDictionary *userInfo =

[NSMutableDictionary

dictionaryWithObject:[NSNumber numberWithInt:signal]

forKey:YunUncaughtExceptionHandlerSignalKey];

NSArray *callStack = [UncaughtExceptionHandler backtrace];

[userInfo

setObject:callStack

forKey:YunUncaughtExceptionHandlerAddressesKey];

[[[UncaughtExceptionHandler alloc] init]

performSelectorOnMainThread:@selector(handleException:)

withObject:

[NSException

exceptionWithName:YunUncaughtExceptionHandlerSignalExceptionName

reason:

[NSString stringWithFormat:

NSLocalizedString(@"Signal %d was raised.", nil),

signal]

userInfo:

[NSDictionary

dictionaryWithObject:[NSNumber numberWithInt:signal]

forKey:YunUncaughtExceptionHandlerSignalKey]]

waitUntilDone:YES];

}

void YunInstallUncaughtExceptionHandler(void)

{

NSSetUncaughtExceptionHandler(&HandleException);

signal(SIGABRT, SignalHandler);

signal(SIGILL, SignalHandler);

signal(SIGSEGV, SignalHandler);

signal(SIGFPE, SignalHandler);

signal(SIGBUS, SignalHandler);

signal(SIGPIPE, SignalHandler);

}

.h文件

//

//  UncaughtExceptionHandler.h

//  UncaughtExceptions

//

//  Created by Matt Gallagher on 2010/05/25.

//  Copyright 2010 Matt Gallagher. All rights reserved.

//

//  Permission is given to use this source code file, free of charge, in any

//  project, commercial or otherwise, entirely at your risk, with the condition

//  that any redistribution (in part or whole) of source code must retain

//  this copyright and permission notice. Attribution in compiled projects is

//  appreciated but not required.

//

#import <UIKit/UIKit.h>

@interface UncaughtExceptionHandler : NSObject{

BOOL dismissed;

}

@end

void HandleException(NSException *exception);

void SignalHandler(int signal);

void YunInstallUncaughtExceptionHandler(void);

iOS crash 异常捕获的更多相关文章

  1. Android进阶——Crash异常捕获并发送到服务器

    在项目中,我们常常会遇到Crash的现象,也就是程序崩溃的时候,这个时候最常看到的就是这个界面 如果你的项目已经发布到市场上了,这样的崩溃对于开发人员是看不到的,所以我们得想方法将崩溃信息发送到服务器 ...

  2. IOS常见异常捕获

    前言:在开发APP时,我们通常都会需要捕获异常,防止应用程序突然的崩溃,防止给予用户不友好的体验.其实Objective-C的异常处理方法和JAVA的雷同,懂JAVA的朋友一看就懂.我为什么要写这篇博 ...

  3. 【IOS】异常捕获 拒绝闪退 让应用从容的崩溃 UncaughtExceptionHandler

    尽管大家都不愿意看到程序崩溃,但可能崩溃是每一个应用必须面对的现实.既然崩溃已经发生.无法阻挡了.那我们就让它崩也崩得淡定点吧. IOS SDK中提供了一个现成的函数 NSSetUncaughtExc ...

  4. iOS异常捕获

    文章目录 一. 系统Crash 二. 处理signal 下面是一些信号说明 关键点注意 三. 实战 四. Crash Callstack分析 – 进⼀一步分析 五. demo地址 六. 参考文献 前言 ...

  5. IOS Crash捕获

    IOS Crash ,就两种情况:一种是异常,另一种是中断[信号量]. #include <libkern/OSAtomic.h> #include <execinfo.h> ...

  6. 漫谈iOS Crash收集框架

    漫谈iOS Crash收集框架   Crash日志收集 为了能够第一时间发现程序问题,应用程序需要实现自己的崩溃日志收集服务,成熟的开源项目很多,如 KSCrash,plcrashreporter,C ...

  7. 第26月第22天 iOS瘦身之armv7 armv7s arm64选用 iOS crash

    1.iOS瘦身之armv7 armv7s arm64选用 机器对指令集的支持是向下兼容的,因此armv7的指令集是可以运行在iphone5S以上的,只是效率没那么高而已~ 但是由于苹果要求必须支持ar ...

  8. iOS crash 崩溃问题的追踪方法

    http://www.cnblogs.com/easonoutlook/archive/2012/12/27/2835884.html iOS crash 崩溃问题的追踪方法 在调试程序的时候,总是碰 ...

  9. iOS: Crash文件解析(一)

    iOS Crash文件的解析(一) 开发程序的过程中不管我们已经如何小心,总是会在不经意间遇到程序闪退.脑补一下当你在一群人面前自信的拿着你的App做功能预演的时候,流畅的操作被无情地Crash打断. ...

随机推荐

  1. QEMU中smp,socket,cores,threads几个参数的理解

    在用QEMU创建KVM guest的时候,为了指定guest cpu资源,用到了-smp, -sockets, -cores, -threads几个参数, #/usr/bin/qemu-system- ...

  2. js学习---常用的内置对象(API)小结 :

    内置对象(API): 日期 Date: getFullYear() 返回完整的4位的年份  如:2016 getMonth()    返回月份,从0开始 getDate()   返回当前月的第几天,当 ...

  3. 用C语言写的双色球

    #include<stdio.h> #include<stdlib.h> #include<time.h> double jieguo(); void main() ...

  4. Java 第四章 选择结构2

    第四章 选择结构 (二) switch 选择结构的执行流程是怎样的? switch 选择结构中break关键字的作用? 本章目标 掌握 switch 选择结构 能够综合运用 if 选择结构 和 swi ...

  5. Xcode7.2 导入XMPP框架错误解决

    1.修改Build Settings 在 Header Search Paths 中添加: "/usr/include/libxml2" 在Other Linker Flags 中 ...

  6. java实验三20135104

    北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计                         班级:1351            姓名:刘帅      ...

  7. Django学习(二)

    一  高亮显示 <script type="text/javascript"> $(document).ready(function () { $("#nav ...

  8. [Windows-Linux]Windows and Linux 共享文件

    在 windows 上共享一个文件夹 共享操作很简单就不多熬述,不过要注意权限分配问题.我们假定共享了 E:\Develop\Share 这个目录. 我们假设主机局域网的 IP 为 192.168.0 ...

  9. DIV与SPAN的区别

    DIV 和 SPAN 元素最大的特点是默认都没有对元素内的对象进行任何格式化渲染.主要用于应用样式表(共同点). 两者最明显的区别在于DIV是块元素,而SPAN是行内元素(也译作内嵌元素). 详解:1 ...

  10. 【Leetcode】【Medium】Decode Ways

    A message containing letters from A-Z is being encoded to numbers using the following mapping: 'A' - ...