您的位置:首页 > 移动开发 > IOS开发

iOS Crash获取闪回日志和上传server

2015-10-26 18:55 781 查看
首先我们整理常常会闪退的异常哪些:数组越界、空引用、引用没有定义方法、内存空间不足等等。

怎样获取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

)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: