crash 上传服务器
来源:互联网 发布:剑网3网络延迟高 编辑:程序博客网 时间:2024/05/21 10:30
第一步:新建一个继承自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上面添加一个按钮并给其添加一个单击事件,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
)
原文地址:http://blog.csdn.net/folish_audi/article/details/36001629
- crash 上传服务器
- ios Crash闪退日志获取和上传至服务器
- iOS Crash闪退日志获取和上传至服务器
- ios Crash闪退日志获取和上传至服务器
- ios Crash闪退日志获取和上传至服务器
- ios Crash闪退日志获取和上传至服务器(NSSetUncaughtExceptionHandler)
- iOS Crash闪退日志获取和上传至服务器(NSSetUncaughtExceptionHandler)
- ios Crash闪退日志获取和上传至服务器(NSSetUncaughtExceptionHandler)
- ios Crash闪退日志获取和上传至服务器(NSSetUncaughtExceptionHandler)
- ios Crash闪退日志获取和上传至服务器(NSSetUncaughtExceptionHandler)
- iOS Crash闪退日志获取和上传至服务器(NSSetUncaughtExceptionHandler)
- iOS Crash闪退日志的捕获和上传至服务器
- 服务器crash处理
- crash log上传之UncaughtExceptionHandler
- Crash信息收集并上传
- iOS-Crash收集以及上传
- Android系统获取应用的Crash信息,保存在本地(可以自己实现上传到自己的服务器)
- android-crash-log-上报服务器
- CAD2007安装之缺少.NET组件解决方法
- 支付宝 sign check fail: check Sign and Data Fail!
- unity3d 发布IOS
- gulp雪碧图插件,gulp-css-spriter简单使用
- 万树IT:Java分布式和高架构,阿里面试题
- crash 上传服务器
- Activity总结
- 前端构建大法 Gulp 系列 (一):为什么需要前端构建
- 使用PHAsset获取图像或视频文件的大小
- 图解正向代理、反向代理、透明代理推荐
- 【腾讯TMQ】Android so的热升级尝试
- 【蓝桥杯】【神秘三位数】
- 万树IT:Android和java学哪个好?
- React Native 多个列表共用一个ListView