Crash收集和處理

首先介紹一款工具 定位解析信號異常上github上搜索DSYMTools,和郵件發(fā)送SKPSMTPMessage


工具自動檢查Xcode的Archive包

配上?

把信號類異常一放工具的工具的錯誤信息內(nèi)存地址點擊分析就能定位了


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()

/**網(wǎng)絡(luò)請求管理者*/

@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(@"異常!7媳臁嘉冒!");

}

}

#pragma mark -上傳crash日志

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

//發(fā)送crash到郵箱

[selfmessageEmailWithException:exception];

//發(fā)送crash到服務(wù)器

//[self messageServerithException:exception];

}

#pragma mark - <發(fā)送給后臺服務(wù)器------------------------------------------>

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

//應(yīng)用版本

NSString*version =AppVersion;

if(nil== version) {

version =@"";

}

//設(shè)備版本

NSString*deviceModel = [PublicMethodiphoneType];

//系統(tǒng)版本

NSString*sysVersion = [UIDevicecurrentDevice].systemVersion;

//郵件主題

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

//調(diào)用棧

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

//崩潰原因

NSString*reason = [exceptionreason];

//崩潰原因

NSString*name = [exceptionname];

NSString*encryptDate = [PublicMethodencryptAESDataWithJSON];

NSMutableDictionary*dict = [NSMutableDictionarydictionary];

//上傳服務(wù)器接口

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

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

NSLog(@"發(fā)送成功");

}else{

NSLog(@"發(fā)送失敗");

}

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

NSLog(@"發(fā)送失敗%@",error);

}];

}

/**網(wǎng)絡(luò)請求管理者*/

- (YLTHTTPSessionManager*)manager {

if(!_manager) {

_manager= [YLTHTTPSessionManagermanager];

}

return_manager;

}

#pragma mark - <發(fā)送郵件------------------------------------------>

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

//應(yīng)用版本

NSString*version =AppVersion;

if(nil== version) {

version =@"";

}

//設(shè)備版本

NSString*deviceModel = [PublicMethodiphoneType];

//系統(tǒng)版本

NSString*sysVersion = [UIDevicecurrentDevice].systemVersion;

//郵件主題

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

//調(diào)用棧

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

//崩潰原因

NSString*reason = [exceptionreason];

//崩潰原因

NSString*name = [exceptionname];

//郵件正文

NSString*body = [NSStringstringWithFormat:@"\n----------------------------------------------------\n當(dāng)你看到這個頁面的時候別慌,簡單的描述下剛才的操作,然后郵件我\n\n----------------------------------------------------\n崩潰標(biāo)識:\n\n%@\n----------------------------------------------------\n崩潰原因:\n\n%@\n----------------------------------------------------\n崩潰詳情:\n\n%@\n",

name,

reason,

[stackSysbolsArraycomponentsJoinedByString:@"\n"]];

SKPSMTPMessage*myMessage = [[SKPSMTPMessagealloc]init];

發(fā)件箱

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

收件箱

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

抄送

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

發(fā)件箱的服務(wù)器主機地址

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

myMessage.requiresAuth=YES;

if(myMessage.requiresAuth) {

// 發(fā)件箱

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

// 發(fā)件箱的POT/SMT/..的密碼,必須要去授權(quán)獲取這個密碼,不然用不了郵件發(fā)送功能

myMessage.pass=@"xxxx";

}

myMessage.wantsSecure=YES;//為gmail郵箱設(shè)置smtp.gmail.com

myMessage.subject= subject;

myMessage.delegate=self;

//設(shè)置郵件內(nèi)容

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(@"如果點擊繼續(xù),程序有可能會出現(xiàn)其他的問題,建議您還是點擊退出按鈕并重新打開\n\n"@"異常原因如下:\n%@\n%@",nil),[exceptionreason],[[exceptionuserInfo]objectForKey:UncaughtExceptionHandlerAddressesKey]];

UIAlertView*alert =[[UIAlertViewalloc]initWithTitle:NSLocalizedString(@"抱歉诫尽,程序出現(xiàn)了異常",nil)

message:message

delegate:self

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

otherButtonTitles:NSLocalizedString(@"繼續(xù)",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(@"恭喜,郵件發(fā)送成功");

}

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

{

NSLog(@"不好意思,郵件發(fā)送失敗");

}

@end

voidHandleException(NSException*exception) {

int32_texceptionCount =OSAtomicIncrement32(&UncaughtExceptionCount);

if(exceptionCount >UncaughtExceptionMaximum) {

return;

}

//調(diào)用棧

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末慈省,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子略板,更是在濱河造成了極大的恐慌毁枯,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叮称,死亡現(xiàn)場離奇詭異种玛,居然都是意外死亡,警方通過查閱死者的電腦和手機瓤檐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門赂韵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人挠蛉,你說我怎么就攤上這事祭示。” “怎么了谴古?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵质涛,是天一觀的道長。 經(jīng)常有香客問我掰担,道長汇陆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任带饱,我火速辦了婚禮毡代,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘勺疼。我一直安慰自己教寂,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布执庐。 她就那樣靜靜地躺著酪耕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪耕肩。 梳的紋絲不亂的頭發(fā)上因妇,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天问潭,我揣著相機與錄音,去河邊找鬼婚被。 笑死狡忙,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的址芯。 我是一名探鬼主播灾茁,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼谷炸!你這毒婦竟也來了北专?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤旬陡,失蹤者是張志新(化名)和其女友劉穎拓颓,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體描孟,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡驶睦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了匿醒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片场航。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖廉羔,靈堂內(nèi)的尸體忽然破棺而出溉痢,到底是詐尸還是另有隱情,我是刑警寧澤憋他,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布孩饼,位于F島的核電站,受9級特大地震影響举瑰,放射性物質(zhì)發(fā)生泄漏捣辆。R本人自食惡果不足惜蔬螟,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一此迅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧旧巾,春花似錦耸序、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至廓握,卻和暖如春搅窿,著一層夾襖步出監(jiān)牢的瞬間嘁酿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工男应, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留闹司,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓沐飘,卻偏偏與公主長得像游桩,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子耐朴,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 程序都會有bug借卧,那么在有bug和異常時能不能給個提醒呢,今天咱們來看看這個問題怎么解決 首先說下基本的NSExc...
    愛吃魚的小灰閱讀 695評論 1 9
  • 要接入上海分部的自己的性能統(tǒng)計和事件統(tǒng)計的 sdk筛峭,在接入之前自己了解下铐刘。看到了一套捕獲異常的代碼影晓。 對于異常分為...
    南京小伙閱讀 858評論 2 1
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理滨达,服務(wù)發(fā)現(xiàn),斷路器俯艰,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • 什么是Signal 在計算機科學(xué)中捡遍,信號(英語:Signals)是Unix、類Unix以及其他POSIX兼容的操作...
    城市之光閱讀 1,482評論 0 1
  • 【專題:玉】 中國的劍是帶著氣的 滿堂花醉三千客谓传,一劍霜寒十四州 青光掠影,奪魂索命芹关,傷人于逍遙無形間续挟。 孫子兵法...
    南陽雅月閱讀 811評論 3 4