Crash收集和处理

首先介绍一款工具 定位解析信号异常上github上搜索DSYMTools,和邮件发送SKPSMTPMessage


工具自动检查Xcode的Archive包

配上 

把信号类异常一放工具的工具的错误信息内存地址点击分析就能定位了


1.解决普通和信号异常

直接使用先上代码

.h文件

#import

#import

@interfaceUncaughtExceptionHandler :NSObject{

BOOLdismissed;

}

@end

voidHandleException(NSException*exception);

voidSignalHandler(intsignal);

voidInstallUncaughtExceptionHandler(void);

.m文件

#import"UncaughtExceptionHandler.h"

#include

#include

#import"SKPSMTPMessage.h"

#import"NSData+Base64Additions.h"

NSString*constUncaughtExceptionHandlerSignalExceptionName =@"UncaughtExceptionHandlerSignalExceptionName";

NSString*constUncaughtExceptionHandlerSignalKey =@"UncaughtExceptionHandlerSignalKey";

NSString*constUncaughtExceptionHandlerAddressesKey =@"UncaughtExceptionHandlerAddressesKey";

NSString*constUncaughtExceptionHandlerStackSysbolsArrayKey =@"UncaughtExceptionHandlerStackSysbolsArrayKey";

volatileint32_tUncaughtExceptionCount =0;

constint32_tUncaughtExceptionMaximum =20;

constNSIntegerUncaughtExceptionHandlerSkipAddressCount =0;

constNSIntegerUncaughtExceptionHandlerReportAddressCount =20;

@interfaceUncaughtExceptionHandler()

/**网络请求管理者*/

@property(strong,nonatomic)YLTHTTPSessionManager*manager;

@end

@implementationUncaughtExceptionHandler

+ (NSArray*)backtrace {

void* callstack[128];

intframes =backtrace(callstack,128);

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

inti;

NSMutableArray*backtrace = [NSMutableArrayarrayWithCapacity:frames];

for(i =UncaughtExceptionHandlerSkipAddressCount; i

[backtraceaddObject:[NSStringstringWithUTF8String:strs[i]]];

}

free(strs);

returnbacktrace;

}

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

if(anIndex ==0){

dismissed=YES;

}elseif(anIndex==1) {

NSLog(@"异常!!!");

}

}

#pragma mark -上传crash日志

- (void)validateAndSaveCriticalApplicationDataWithException:(NSException*)exception {

//发送crash到邮箱

[selfmessageEmailWithException:exception];

//发送crash到服务器

//[self messageServerithException:exception];

}

#pragma mark - <发送给后台服务器------------------------------------------>

- (void)messageServerithException:(NSException*)exception {

//应用版本

NSString*version =AppVersion;

if(nil== version) {

version =@"";

}

//设备版本

NSString*deviceModel = [PublicMethodiphoneType];

//系统版本

NSString*sysVersion = [UIDevicecurrentDevice].systemVersion;

//邮件主题

NSString*subject = [NSStringstringWithFormat:@"[Crash][iOS][%@][%@][%@]", version, sysVersion, deviceModel];

//调用栈

NSArray*stackSysbolsArray = [[exceptionuserInfo]objectForKey:UncaughtExceptionHandlerAddressesKey];

//崩溃原因

NSString*reason = [exceptionreason];

//崩溃原因

NSString*name = [exceptionname];

NSString*encryptDate = [PublicMethodencryptAESDataWithJSON];

NSMutableDictionary*dict = [NSMutableDictionarydictionary];

//上传服务器接口

[self.managerPOST:@"https://passport.zgylt.com/Data/CollectionException"parameters:dictprogress:nilsuccess:^(NSURLSessionDataTask*_Nonnulltask,id_NullableresponseObject) {

if([responseObject[@"Code"]isEqualToString:@"200"]) {

NSLog(@"发送成功");

}else{

NSLog(@"发送失败");

}

}failure:^(NSURLSessionDataTask*_Nullabletask,NSError*_Nonnullerror) {

NSLog(@"发送失败%@",error);

}];

}

/**网络请求管理者*/

- (YLTHTTPSessionManager*)manager {

if(!_manager) {

_manager= [YLTHTTPSessionManagermanager];

}

return_manager;

}

#pragma mark - <发送邮件------------------------------------------>

- (void)messageEmailWithException:(NSException*)exception {

//应用版本

NSString*version =AppVersion;

if(nil== version) {

version =@"";

}

//设备版本

NSString*deviceModel = [PublicMethodiphoneType];

//系统版本

NSString*sysVersion = [UIDevicecurrentDevice].systemVersion;

//邮件主题

NSString*subject = [NSStringstringWithFormat:@"[Crash][iOS][%@][%@][%@]", version, sysVersion, deviceModel];

//调用栈

NSArray*stackSysbolsArray = [[exceptionuserInfo]objectForKey:UncaughtExceptionHandlerAddressesKey];

//崩溃原因

NSString*reason = [exceptionreason];

//崩溃原因

NSString*name = [exceptionname];

//邮件正文

NSString*body = [NSStringstringWithFormat:@"\n----------------------------------------------------\n当你看到这个页面的时候别慌,简单的描述下刚才的操作,然后邮件我\n\n----------------------------------------------------\n崩溃标识:\n\n%@\n----------------------------------------------------\n崩溃原因:\n\n%@\n----------------------------------------------------\n崩溃详情:\n\n%@\n",

name,

reason,

[stackSysbolsArraycomponentsJoinedByString:@"\n"]];

SKPSMTPMessage*myMessage = [[SKPSMTPMessagealloc]init];

发件箱

myMessage.fromEmail=@"xxx@163.com";

收件箱

myMessage.toEmail=@"xxxx@qq.com";

抄送

myMessage.bccEmail=@"xxxxx@qq.com";

发件箱的服务器主机地址

myMessage.relayHost=@"smtp.163.com";

myMessage.requiresAuth=YES;

if(myMessage.requiresAuth) {

// 发件箱

myMessage.login=@"xxx@163.com";

// 发件箱的POT/SMT/..的密码,必须要去授权获取这个密码,不然用不了邮件发送功能

myMessage.pass=@"xxxx";

}

myMessage.wantsSecure=YES;//为gmail邮箱设置smtp.gmail.com

myMessage.subject= subject;

myMessage.delegate=self;

//设置邮件内容

NSDictionary*plainPart = [NSDictionarydictionaryWithObjectsAndKeys:@"text/plain; charset=UTF-8",kSKPSMTPPartContentTypeKey,

body,kSKPSMTPPartMessageKey,@"8bit",kSKPSMTPPartContentTransferEncodingKey,nil];

myMessage.parts= [NSArrayarrayWithObjects:plainPart,nil];

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{

[myMessagesend];

});

}

- (void)handleException:(NSException*)exception {

[selfvalidateAndSaveCriticalApplicationDataWithException:exception];

NSString*message = [NSStringstringWithFormat:NSLocalizedString(@"如果点击继续,程序有可能会出现其他的问题,建议您还是点击退出按钮并重新打开\n\n"@"异常原因如下:\n%@\n%@",nil),[exceptionreason],[[exceptionuserInfo]objectForKey:UncaughtExceptionHandlerAddressesKey]];

UIAlertView*alert =[[UIAlertViewalloc]initWithTitle:NSLocalizedString(@"抱歉,程序出现了异常",nil)

message:message

delegate:self

cancelButtonTitle:NSLocalizedString(@"退出",nil)

otherButtonTitles:NSLocalizedString(@"继续",nil),nil];

[alertshow];

CFRunLoopRefrunLoop =CFRunLoopGetCurrent();

CFArrayRefallModes =CFRunLoopCopyAllModes(runLoop);

while(!dismissed) {

for(NSString*modein(__bridgeNSArray*)allModes) {

CFRunLoopRunInMode((__bridgeCFStringRef)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([[exceptionname]isEqual:UncaughtExceptionHandlerSignalExceptionName]) {

kill(getpid(), [[[exceptionuserInfo]objectForKey:UncaughtExceptionHandlerSignalKey]intValue]);

}else{

[exceptionraise];

}

}

- (void)messageSent:(SKPSMTPMessage*)message

{

NSLog(@"恭喜,邮件发送成功");

}

- (void)messageFailed:(SKPSMTPMessage*)message error:(NSError*)error

{

NSLog(@"不好意思,邮件发送失败");

}

@end

voidHandleException(NSException*exception) {

int32_texceptionCount =OSAtomicIncrement32(&UncaughtExceptionCount);

if(exceptionCount >UncaughtExceptionMaximum) {

return;

}

//调用栈

NSArray*stackSysbolsArray = [exceptioncallStackSymbols];

NSMutableDictionary*userInfo =[NSMutableDictionarydictionaryWithDictionary:[exceptionuserInfo]];

[userInfosetObject:[NSArrayarrayWithArray:stackSysbolsArray]forKey:UncaughtExceptionHandlerAddressesKey];

[[[UncaughtExceptionHandleralloc]init]performSelectorOnMainThread:@selector(handleException:)withObject:

[NSExceptionexceptionWithName:[exceptionname]reason:[exceptionreason]userInfo:userInfo]waitUntilDone:YES];

}

voidSignalHandler(intsignal) {

int32_texceptionCount =OSAtomicIncrement32(&UncaughtExceptionCount);

if(exceptionCount >UncaughtExceptionMaximum) {

return;

}

NSMutableDictionary*userInfo =[NSMutableDictionarydictionaryWithObject:[NSNumbernumberWithInt:signal]forKey:UncaughtExceptionHandlerSignalKey];

NSArray*callStack = [UncaughtExceptionHandlerbacktrace];

[userInfosetObject:callStackforKey:UncaughtExceptionHandlerAddressesKey];

[[[UncaughtExceptionHandleralloc]init]performSelectorOnMainThread:@selector(handleException:)

withObject:[NSExceptionexceptionWithName:UncaughtExceptionHandlerSignalExceptionName

reason:[NSStringstringWithFormat:NSLocalizedString(@"Signal %d was raised.",nil),signal]userInfo:userInfo]

waitUntilDone:YES];

}

voidInstallUncaughtExceptionHandler(void) {

NSSetUncaughtExceptionHandler(&HandleException);

signal(SIGABRT,SignalHandler);

signal(SIGILL,SignalHandler);

signal(SIGSEGV,SignalHandler);

signal(SIGFPE,SignalHandler);

signal(SIGBUS,SignalHandler);

signal(SIGPIPE,SignalHandler);

}

邮件处理

http://blog.csdn.net/u010218226/article/details/53114595

http://blog.csdn.net/aldridge1/article/details/38826035

http://blog.csdn.net/aldridge1/article/details/38826035

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • 程序都会有bug,那么在有bug和异常时能不能给个提醒呢,今天咱们来看看这个问题怎么解决 首先说下基本的NSExc...
    爱吃鱼的小灰阅读 690评论 1 9
  • 要接入上海分部的自己的性能统计和事件统计的 sdk,在接入之前自己了解下。看到了一套捕获异常的代码。 对于异常分为...
    南京小伙阅读 847评论 2 1
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • 什么是Signal 在计算机科学中,信号(英语:Signals)是Unix、类Unix以及其他POSIX兼容的操作...
    城市之光阅读 1,445评论 0 1
  • 【专题:玉】 中国的剑是带著气的 满堂花醉三千客,一剑霜寒十四州 青光掠影,夺魂索命,伤人于逍遥无形间。 孙子兵法...
    南阳雅月阅读 802评论 3 4