iOS Crash获取闪回日志和上传server
首先我们整理常常会闪退的异常哪些:数组越界、空引用、引用没有定义方法、内存空间不足等等。
怎样获取crash闪退日志 -- 工具查看
先看第一个问题怎样查看,我搜索的方法有下面几个:
第一个方法:XCode 的菜单Window->Organizer 选择Devices -> 选中的手机 -> 点击手机名称左边的箭头 会等到例如以下图

注意对照一下红色框框内容,这个日志也基本上上告诉你crash的原因了。
另外一种方法 打开手机 - > 设置 -> 隐私 - > 诊断与用量 - > 诊断与用量数据 这里面就是全部应用的Crash日志。
第三种方法 通过iTunes Connect(Manage Your Applications - View Details - Crash Reports)获取用户的crash日志。方法非常多这里不多列了。
解析crash
參见:http://stackoverflow.com/questions/1460892/symbolicating-iphone-app-crash-reports )
用程序获取crash日志
可是这里都是工具,没实用到程序获取,经过千方百计的查询(思路是:先找到存放crash的iphone系统路径:var/mobile/Library/Logs/CrashReporter)找到了crash存放的路径。唉,苦于无法读取(用程序读出来都是nil)。当然假设是越狱手机就不一样是能够读取的。这个思路断掉了。
换个思路:自己用程序捕获crash。保存到本地能够吗?这么一试,果然........
第一步:新建一个继承自NSObject的类(Xcode新建一个空项目过程略),取名字CatchCrash,在h和m文件里写下:
.h文件
#import <Foundation/Foundation.h>
@interface CatchCrash : NSObject
void uncaughtExceptionHandler(NSException *exception);
@end
.m文件
#import "CatchCrash.h"
@implementation CatchCrash
void uncaughtExceptionHandler(NSException *exception)
{
// 异常的堆栈信息
NSArray *stackArray = [exception callStackSymbols];
// 出现异常的原因
NSString *reason = [exception reason];
// 异常名称
NSString *name = [exception name];
NSString *exceptionInfo = [NSString stringWithFormat:@"Exception reason:%@\nException name:%@\nException stack:%@",name, reason, stackArray];
NSLog(@"%@", exceptionInfo);
NSMutableArray *tmpArr = [NSMutableArray arrayWithArray:stackArray];
[tmpArr insertObject:reason atIndex:0];
//保存到本地 -- 当然你能够在下次启动的时候,上传这个log
[exceptionInfo writeToFile:[NSString stringWithFormat:@"%@/Documents/error.log",NSHomeDirectory()] atomically:YES encoding:NSUTF8StringEncoding error:nil];
}
@end
第二步:加入一个继承自UIViewcontroller的类,取名字为TestViewController。
第三步:注冊CatchCrash异常处理方法,在Appdelegate写下例如以下代码:
#import "AppDelegate.h"
#import "CatchCrash.h"
#import "TestViewController.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
//注冊消息处理函数的处理方法
NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);
TestViewController *testVc = [[TestViewController alloc] init];
self.window.rootViewController = testVc;
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}
第四部:在TestViewController的Xib上面加入一个button并给其加入一个单击事件。TestViewController.m文件里有例如以下代码:
#import "TestViewController.h"
@interface TestViewController ()
@end
@implementation TestViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
#pragma mark - 单击事件
- (IBAction)crashTapped:(id)sender
{
//常见异常1---不存在方法引用
// [self performSelector:@selector(thisMthodDoesNotExist) withObject:nil];
//常见异常2---键值对引用nil
// [[NSMutableDictionary dictionary] setObject:nil forKey:@"nil"];
//常见异常3---数组越界
[[NSArray array] objectAtIndex:1];
//常见异常4---memory warning 级别3以上
// [self performSelector:@selector(killMemory) withObject:nil];
//其它大家去想吧
}
#pragma mark - custom method
- (void) killMemory
{
for (int i = 0; i < 300; i ++)
{
UILabel *tmpLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 200)];
tmpLabel.layer.masksToBounds = YES;
tmpLabel.layer.cornerRadius = 10;
tmpLabel.backgroundColor = [UIColor redColor];
[self.view addSubview:tmpLabel];
}
}
@end
执行代码:能够看到闪退,导出error日志,我们能够看到:
Exception reason:NSRangeException
<span style="color:#FF0000;">Exception name:*** -[__NSArrayI objectAtIndex:]: index 1 beyond bounds for empty array</span>
Exception stack:(
0 CoreFoundation 0x2f2edfeb <redacted> + 154
1 libobjc.A.dylib 0x39b66ccf objc_exception_throw + 38
2 CoreFoundation 0x2f224a89 <redacted> + 176
<span style="color:#FF0000;"> 3 TestCrash 0x000e8077 -[TestViewController crashTapped:] + 126</span>
4 UIKit 0x31b3f057 <redacted> + 90
5 UIKit 0x31b3eff7 <redacted> + 30
6 UIKit 0x31b3efd1 <redacted> + 44
7 UIKit 0x31b2a737 <redacted> + 374
8 UIKit 0x31b3ea4f <redacted> + 590
9 UIKit 0x31b3e721 <redacted> + 528
10 UIKit 0x31b396eb <redacted> + 758
11 UIKit 0x31b0e8ed <redacted> + 196
12 UIKit 0x31b0cf97 <redacted> + 7102
13 CoreFoundation 0x2f2b925b <redacted> + 14
14 CoreFoundation 0x2f2b872b <redacted> + 206
15 CoreFoundation 0x2f2b6f1f <redacted> + 622
16 CoreFoundation 0x2f221f0f CFRunLoopRunSpecific + 522
17 CoreFoundation 0x2f221cf3 CFRunLoopRunInMode + 106
18 GraphicsServices 0x3417a663 GSEventRunModal + 138
19 UIKit 0x31b6d16d UIApplicationMain + 1136
20 TestCrash 0x000e810d main + 116
21 libdyld.dylib 0x3a073ab7 <redacted> + 2
)
版权声明:本文博主原创文章。博客,未经同意不得转载。
iOS Crash获取闪回日志和上传server的更多相关文章
- Oracle Flashback Technologies - 估算不同时间段闪回日志的产生量
Oracle Flashback Technologies - 估算不同时间段闪回日志的产生量 v$flashback_database_stat监控闪回数据的i/o开销的统计信息,根据之前的系统负载 ...
- ORACLE数据库闪回日志写满
网站页面无法显示完整.检查web服务是正常的,所以可能是ORACLE数据库出了问题. 首先检查闪回日志写满 然后检查归档日志文件写满的缘故了.使用以下几个命令可以看出当前归档日志文件的使用情况: se ...
- oracle修改闪回日志的位置
改变闪回日志位置的步骤: A.Change the value of the DB_RECOVERY_FILE_DEST initialization parameter to a new value ...
- iOS Crash 分析 符号化崩溃日志
参考: http://blog.csdn.net/diyagoanyhacker/article/details/41247367 http://blog.csdn.net/diyagoanyhack ...
- Oracle 六闪回技术,flashback
Flashback 技术基于Undo segment基于内容的, 因此,限制UNDO_RETENTON参数. 要使用flashback 特征,您必须启用自己主动撤销管理表空间. 在Oracle 11g ...
- 【DG】利用闪回数据库(flashback)修复Failover后的DG环境
利用闪回数据库(flashback)修复Failover后的DG环境 1.1 BLOG文档结构图 1.2 前言部分 1.2.1 导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能, ...
- FlashBack 闪回
[学习目标] Flashback Database 功能非常类似与RMAN的不完全恢复,它可以把整个数据库回退到 过去的某个时点的状态,这个功能依赖于Flashback log日志.比RMAN 更快速 ...
- oracle 闪回功能详解
Oracle的闪回技术提供了一组功能,可以访问过去某一时间的数据并从人为错误中恢复.闪回技术是Oracle 数据库独有的,支持任何级别的恢复,包括行.事务.表和数据库范围.使用闪回特性,您可以查询以前 ...
- Oracle 闪回总结
一.闪回查询(Flashback Query)1.闪回查询技术1.1 闪回查询机制 闪回查询是指利用数据库回滚段存放的信息查看指定表中过去某个时间点的数据信息,或过去某个时间段数据的变化情况,或 ...
随机推荐
- 《Head First 设计模式》学习笔记——模板方法模式
模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以详细方法以及详细构造函数的形式实现.然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类能够以不同的方式实现这些抽象方法,从而对剩余的逻辑有 ...
- 一个好用的Dialog插件
网页中常常须要弹出dialog,尽管非常多JS开源框架都提供这个功能,可是效果都不是非常好,比方easy-UI.改动样式这些又不是我擅长的,身边又没有美工兄弟,苦逼啊! (Easy-UI的BasicD ...
- tar.gz文件命名和压缩解压方法
tar.gz文件命名 tar这是文件打成一个包,无压缩; gz同gzip标记的包.tar文件压缩; 所以它成为一个.tar.gz档 压缩 # tar cvfz backup.tar.gz /xxx/ ...
- SQL视图索引
视图: 视图就相当于一个查询结果,它相对应的是表 表----真正存储数据的地方 视图---不存储数据,展示查询的结果 注意: 1.视图就是为了查询数据方便.一般不要试图向视图中插入数据,容易出错. 2 ...
- Oracle中四种循环(GOTO、For、While、Loop)
DECLARE x number; BEGIN x:=9; <<repeat_loop>> --循环点 x:=x-1; DBMS_OUTPUT.PUT_LINE(X); IF ...
- UVA 10245 The Closest Pair Problem 最近点问题 分治算法
题意,给出n个点的坐标,找出两点间最近的距离,如果小于10000就输出INFINITY. 纯暴力是会超时的,所以得另辟蹊径,用分治算法. 递归思路将点按坐标排序后,分成两块处理,最近的距离不是在两块中 ...
- FreeSwitch安装和配置记录
安装FreeSwitch 主要示例,下面的命令: git clone -b v1.2.stable git://git.freeswitch.org/freeswitch.git cd freeswi ...
- No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=arm64, VALID_ARCHS=armv7 armv7s)
问题: No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=arm64, VALID_ARCHS=armv7 armv ...
- 使用Swing实现简易而不简单的文档编辑器
本文通过Swing来实现文档简易而不简单的文档编辑器,该文档编辑器的功能包括: 设置字体样式:粗体,斜体,下划线,可扩展 设置字体:宋体,黑体,可扩展 设置字号:12,14,18,20,30,40, ...
- VSTO学习笔记(四)从SharePoint 2010中下载文件
原文:VSTO学习笔记(四)从SharePoint 2010中下载文件 上一次我们开发了一个简单的64位COM加载项,虽然功能很简单,但是包括了开发一个64位COM加载项的大部分过程.本次我们来给CO ...