版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】iOS捕获全局异常,统一收集
参考博文:/easonoutlook/archive/2012/12/27/2835979.html开发程序的过程中不管我们已经如何小心,总是会在不经意间遇到程序闪退。流畅的操作被无情地Crash打断,当程序运行Crash的时候,系统会把运行的最后时刻的运行信息记录下来,存储到一个文件中,也就是我们所说的Crash文件,当时如果是真机测试离开Xcode的时候Crash掉,我们是无法知道crash的具体位置的。现在做一个程序统一记录crash的位置。先科普一下crash的知识:Crash文件结构1、ProcessInformation(进程信息)2、BasicInformation
3、Exception(非常重要)
4、ThreadBacktrace发生Crash的线程的Crash调用栈,从上到下分别代表调用顺序,最上面的一个表示抛出异常的位置,依次往下可以看到API的调用顺序。上图的信息表明本次Crash出现xxxViewController的323行,出错的函数调用为orderCountLoadFailed。5、ThreadStateCrash时发生时刻,线程的状态,通常我们根据Crash栈即可获取到相关信息,这部分一般不用关心。6、BinaryImagesCrash时刻App加载的所有的库,其中第一行是Crash发生时我们App可执行文件的信息,可以看出为armv7,可执行文件的包得uuid位c0f……cd65,解析Crash的时候dsym文件的uuid必须和这个一样才能完成Crash的符号化解析。废话说了那么多,到底怎么捕获整个系统的crash呢,入正题,其实也很简单:创建一个工具类
ExceptionHandler.h
和
ExceptionHandler.m(oc版本),swift版本的下面再讲.ExceptionHandler.h#import<UIKit/UIKit.h>@interface
ExceptionHandler:NSObject{BOOLdismissed;}@endvoidHandleException(NSException*exception);voidSignalHandler(intsignal);voidInstallUncaughtExceptionHandler(void);ExceptionHandler.m#import"ExceptionHandler.h"#include<libkern/OSAtomic.h>#include<execinfo.h>NSString*constExceptionHandlerSignalExceptionName=@"UncaughtExceptionHandlerSignalExceptionName";NSString*constExceptionHandlerSignalKey=@"UncaughtExceptionHandlerSignalKey";NSString*constExceptionHandlerAddressesKey=@"UncaughtExceptionHandlerAddressesKey";volatileint32_tUncaughtExceptionCount=0;constint32_tUncaughtExceptionMaximum=10;constNSIntegerExceptionHandlerSkipAddressCount=4;constNSIntegerExceptionHandlerReportAddressCount=5;@implementationExceptionHandler+(NSArray*)backtrace{void
*callstack[128];
intframes=backtrace(callstack,128);
char**strs=backtrace_symbols(callstack,frames);
inti;NSMutableArray*backtrace=[NSMutableArrayarrayWithCapacity:frames];for(i=ExceptionHandlerSkipAddressCount;i<ExceptionHandlerSkipAddressCount+ExceptionHandlerReportAddressCount;i++){[backtraceaddObject:[NSStringstringWithUTF8String:strs[i]]];}free(strs);
returnbacktrace;}-(void)alertView:(UIAlertView*)anAlertViewclickedButtonAtIndex:(NSInteger)anIndex{if(anIndex==0){dismissed=YES;}}-(void)validateAndSaveCriticalApplicationData{}-(void)handleException:(NSException*)exception{[selfvalidateAndSaveCriticalApplicationData];UIAlertView*alert=[[UIAlertViewalloc]initWithTitle:NSLocalizedString(@"Unhandledexception",nil)message:[NSStringstringWithFormat:NSLocalizedString(@"Youcantrytocontinuebuttheapplicationmaybeunstable.\n\n"@"Debugdetailsfollow:\n%@\n%@",nil),[exceptionreason],[[exceptionuserInfo]objectForKey:ExceptionHandlerAddressesKey]]delegate:selfcancelButtonTitle:NSLocalizedString(@"Quit",nil)otherButtonTitles:NSLocalizedString(@"Continue",nil),nil];[alertshow];
NSUserDefaults*defaults=[NSUserDefaultsstandardUserDefaults];
CFRunLoopRefrunLoop=CFRunLoopGetCurrent();CFArrayRefallModes=CFRunLoopCopyAllModes(runLoop);while(!dismissed){for(NSString*modein(NSArray*)allModes){CFRunLoopRunInMode((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([[exceptionname]isEqual:ExceptionHandlerSignalExceptionName]){kill(getpid(),[[[exceptionuserInfo]objectForKey:ExceptionHandlerSignalKey]intValue]);}else{[exceptionraise];}}@endvoidHandleException(NSException*exception){int32_texceptionCount=OSAtomicIncrement32(&UncaughtExceptionCount);if(exceptionCount>UncaughtExceptionMaximum){return;}NSArray*callStack=[ExceptionHandlerbacktrace];NSMutableDictionary*userInfo=[NSMutableDictionarydictionaryWithDictionary:[exceptionuserInfo]];[userInfosetObject:callStackforKey:ExceptionHandlerAddressesKey];[[[ExceptionHandleralloc]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:ExceptionHandlerSignalKey];NSArray*callStack=[ExceptionHandlerbacktrace];[userInfosetObject:callStackforKey:ExceptionHandlerAddressesKey];[[[ExceptionHandleralloc]init]performSelectorOnMainThread:@selector(handleException:)withObject:[NSExceptionexceptionWithName:ExceptionHandlerSignalExceptionNamereason:[NSStringstringWithFormat:NSLocalizedString(@"Signal%dwasraised.",nil),signal]userInfo:[NSDictionarydictionaryWithObject:[NSNumbernumberWithInt:signal]forKey:ExceptionHandlerSignalKey]]waitUntilDone:YES];}voidInstallUncaughtExceptionHandler(void){NSSetUncaughtExceptionHandler(&HandleException);signal(SIGABRT,SignalHandler);signal(SIGILL,SignalHandler);signal(SIGSEGV,SignalHandler);signal(SIGFPE,SignalHandler);signal(SIGBUS,SignalHandler);signal(SIGPIPE,SignalHandler);}使用方式:-(BOOL)application:(UIApplication*)applicationdidFinishLaunchingWithOptions:(NSDictionary*)launchOptions{
InstallUncaughtExceptionHandler();
returnYES;}大功告成swift版本:funcapplication(application:UIApplication,didFinishLaunchingWithOptionslaunchOptions:[NSObject:AnyObject]?)->Bool{
//输出bug信息
print("系统bug日志记录---------------------\(NSUserDefaults.standardUserDefaults().valueForKey(ERROR_MESSAGE))")
NSSetUncaughtExceptionHandler{exceptionin
varmessage=excep
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年吉林省龙井市高考物理一模考试卷(巩固)附答案详解
- 2026年浙江省瑞安市高考物理周测试卷含完整答案详解【名校卷】
- 2025年湖南省吉首市高考物理二模模拟卷及答案详解(历年真题)
- 2026年河北省高碑店市高考物理一轮复习试卷附参考答案详解(考试直接用)
- 2025年辽宁省灯塔市高考物理真题汇编试卷(考点提分)附答案详解
- 2026年江西省共青城市高考物理三轮冲刺试卷【B卷】附答案详解
- 2026年河北省深州市高考物理强基计划考试卷附参考答案详解(研优卷)
- 2025年湖南省吉首市高考物理5月学情自测模拟卷附参考答案详解【突破训练】
- 三年级数学计算题专项练习及答案
- 用电安全管理准则
- 2025年四川泸州市交通投资集团有限责任公司招聘笔试参考题库附带答案详解
- 职业技术学院《思想道德与法治》课程标准
- 《常见职业病危害与防护宣传手册》
- 家庭医生培训
- 前程无忧行测题答案
- 智能楼宇管理员职业技能竞赛(市赛)考试题库(含答案)
- 量子力学+周世勋(全套完整)课件
- 人教版小学六年级数学试卷及答案1套
- 有趣的行为金融学智慧树知到期末考试答案章节答案2024年上海海洋大学
- 溺水的急救和护理课件
- 价值营销与价格战略价格策略培训
评论
0/150
提交评论