如何为应用创建收集崩溃日志文本
2017-09-22 11:50
846 查看
在我们开发的应用中,总是不可避免地会产生Bug。要是能够把应用的崩溃信息收集起来并传到我们能够接收到的地方,那么对于已发布上线的应用所发生的崩溃我们就能够很好地对其进行分析了。
这里要提到的一个函数就是在iOS SDK中自带的NSSetUncaughtExceptionHandler,可用来做异常处理,但功能较为有限,而引起崩溃的大多数原因如:内存访问错误,重复释放等错误就无能为力了,因为这种错误它抛出的是Signal,所以必须要专门做Signal处理。
下面分享我的做法:
在AppDelegate.m文件中的didFinishLaunchingWithOptions方法中,
这里要提到的一个函数就是在iOS SDK中自带的NSSetUncaughtExceptionHandler,可用来做异常处理,但功能较为有限,而引起崩溃的大多数原因如:内存访问错误,重复释放等错误就无能为力了,因为这种错误它抛出的是Signal,所以必须要专门做Signal处理。
下面分享我的做法:
在AppDelegate.m文件中的didFinishLaunchingWithOptions方法中,
[self creatExceptionText]; //注册异常崩溃消息处理函数的处理方法 NSSetUncaughtExceptionHandler (&UncaughtExceptionHandler); void UncaughtExceptionHandler(NSException *exception) { NSMutableDictionary *logDic = [[NSMutableDictionary alloc]init]; [logDic setObject:[NSDate date] forKey:@"date"]; // exception info 崩溃/异常信息 NSArray *arr = [exception callStackSymbols]; NSString *reason = [exception reason]; NSString *name = [exception name]; [logDic setObject:name forKey:@"name"]; [logDic setObject:reason forKey:@"reason"]; [logDic setObject:[arr componentsJoinedByString:@"\n"] forKey:@"log"]; // Device info 设备信息 [logDic setObject:[UIDevice currentDevice].model forKey:@"device"]; [logDic setObject:[UIDevice currentDevice].systemVersion forKey:@"osversion"]; // batteryLevel info 电池剩余电量信息 [[UIDevice currentDevice] setBatteryMonitoringEnabled:YES]; [logDic setObject:[NSNumber numberWithFloat:[UIDevice currentDevice].batteryLevel*100] forKey:@"batteryLevel"]; [[UIDevice currentDevice] setBatteryMonitoringEnabled:NO]; NSString *path = logPathUrl(); NSDictionary *logfile = [NSDictionary dictionaryWithDictionary:logDic]; [logfile writeToFile:path atomically:YES];//把错误日志写入文件 } /** 获取崩溃日志的文件路径 @return 崩溃日志的文件路径 */ NSString *logPathUrl() { return [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"Carsh.txt"]; } - (void)creatExceptionText{ NSFileManager *fileManager = [NSFileManager defaultManager]; NSArray *document = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *docu = [document firstObject]; NSString *filePath = [docu stringByAppendingPathComponent:@"Carsh.txt"]; if (![fileManager fileExistsAtPath:filePath]) { [fileManager createFileAtPath:filePath contents:nil attributes:nil]; } else{ //1、日志是否有内容 NSData *data = [NSData dataWithContentsOfFile:filePath]; if (data.length > 0) { //2、则把崩溃日志文件上传至服务器中 if ([Utils httpPostCrashFile:filePath]) { //3、最后是否成功移除崩溃日志 if([fileManager removeItemAtPath:filePath error:nil]){ NSLog(@"Carsh.txt remove successful"); } } } } }
相关文章推荐
- Android应用如何反馈Crash报告(即上传崩溃日志信息)
- Xcode7.3下如何分析线上(已通过AppStore审核)IOS应用的崩溃日志
- 如何使用 CoreText 创建一个简单的杂志应用
- GitHub 学习与应用——Windows中如何创建与配置ssh key
- 集成Firebase收集崩溃日志
- 如何创建一个Sencha Touch 2应用_记事本案例(第四部分)
- .Net语言 APP开发平台——Smobiler学习日志:在手机应用开发中如何实现跳转地图
- Android崩溃日志收集是个什么鬼?
- 如何创建/删除部门网站(子网站) - [MOSS 2007应用日记]
- Parse教程——如何简单地使用Parse在iOS应用创建后台服务
- 如何收集项目日志统一发送到kafka中?
- 如何为应用创建短链接
- 教你如何对ios崩溃(crash)日志做符号化
- 如何通过友盟分析发布后App崩溃日志
- iOS应用崩溃日志分析
- 如何创建简单ATL服务应用
- 获取iOS应用的崩溃日志
- 如何让IOS应用从容地崩溃
- Flume日志收集分层架构应用实践
- 如何在APICloud平台创建APP应用?