zoukankan      html  css  js  c++  java
  • 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文件

    1. #import <Foundation/Foundation.h>  

    2. @interface CatchCrash : NSObject  

    3. void uncaughtExceptionHandler(NSException *exception);   

    4. @end 

    .m文件

    1. #import "CatchCrash.h"  

    2. @implementation CatchCrash  

    3. void uncaughtExceptionHandler(NSException *exception)  

    4. {  

    5.     // 异常的堆栈信息  

    6.     NSArray *stackArray = [exception callStackSymbols];  

    7.     // 出现异常的原因  

    8.     NSString *reason = [exception reason];  

    9.     // 异常名称  

    10.     NSString *name = [exception name];  

    11.     NSString *exceptionInfo = [NSString stringWithFormat:@"Exception reason:%@ Exception name:%@ Exception stack:%@",name, reason, stackArray];  

    12.     NSLog(@"%@", exceptionInfo);  

    13.     NSMutableArray *tmpArr = [NSMutableArray arrayWithArray:stackArray];  

    14.     [tmpArr insertObject:reason atIndex:0];  

    15.     //保存到本地  --  当然你能够在下次启动的时候,上传这个log  

    16.     [exceptionInfo writeToFile:[NSString stringWithFormat:@"%@/Documents/error.log",NSHomeDirectory()]  atomically:YES encoding:NSUTF8StringEncoding error:nil];  

    17. }  

    18. @end  

    第二步:加入一个继承自UIViewcontroller的类,取名字为TestViewController。

    第三步:注冊CatchCrash异常处理方法,在Appdelegate写下例如以下代码:

    1. #import "AppDelegate.h"  

    2. #import "CatchCrash.h"  

    3. #import "TestViewController.h"  

    4. @implementation AppDelegate  

    5. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions  

    6. {  

    7.     self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];  

    8.     // Override point for customization after application launch.  

    9.     //注冊消息处理函数的处理方法  

    10.     NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);   

    11.     TestViewController *testVc = [[TestViewController alloc] init];  

    12.     self.window.rootViewController = testVc;       

    13.     self.window.backgroundColor = [UIColor whiteColor];  

    14.     [self.window makeKeyAndVisible];  

    15.     return YES;  

    16. }  


           第四部:在TestViewController的Xib上面加入一个button并给其加入一个单击事件。TestViewController.m文件里有例如以下代码:

    1. #import "TestViewController.h"  

    2. @interface TestViewController ()  

    3. @end  

    4.   

    5. @implementation TestViewController  

    6. - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil  

    7. {  

    8.     self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];  

    9.     if (self) {  

    10.         // Custom initialization  

    11.     }  

    12.     return self;  

    13. }  

    14.   

    15. - (void)viewDidLoad  

    16. {  

    17.     [super viewDidLoad];  

    18.     // Do any additional setup after loading the view from its nib.  

    19. }  

    20.   

    21. - (void)didReceiveMemoryWarning  

    22. {  

    23.     [super didReceiveMemoryWarning];  

    24.     // Dispose of any resources that can be recreated.  

    25. }  

    26.   

    27. #pragma mark - 单击事件  

    28. - (IBAction)crashTapped:(id)sender  

    29. {  

    30.     //常见异常1---不存在方法引用  

    31. //    [self performSelector:@selector(thisMthodDoesNotExist) withObject:nil];   

    32.     //常见异常2---键值对引用nil  

    33. //    [[NSMutableDictionary dictionary] setObject:nil forKey:@"nil"];  

    34.     //常见异常3---数组越界  

    35.     [[NSArray array] objectAtIndex:1];  

    36.     //常见异常4---memory warning 级别3以上  

    37. //    [self performSelector:@selector(killMemory) withObject:nil];  

    38.     //其它大家去想吧  

    39. }  

    40.   

    41. #pragma mark - custom method  

    42. - (void) killMemory  

    43. {  

    44.     for (int i = 0; i < 300; i ++)  

    45.     {  

    46.         UILabel *tmpLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 200)];  

    47.         tmpLabel.layer.masksToBounds = YES;  

    48.         tmpLabel.layer.cornerRadius = 10;  

    49.         tmpLabel.backgroundColor = [UIColor redColor];  

    50.         [self.view addSubview:tmpLabel];  

    51.     }  

    52. }  

    53. @end  

    执行代码:能够看到闪退,导出error日志,我们能够看到:

    1. Exception reason:NSRangeException  

    2. <span style="color:#FF0000;">Exception name:*** -[__NSArrayI objectAtIndex:]: index 1 beyond bounds for empty array</span>  

    3. Exception stack:(  

    4.     0   CoreFoundation                      0x2f2edfeb <redacted> + 154  

    5.     1   libobjc.A.dylib                     0x39b66ccf objc_exception_throw + 38  

    6.     2   CoreFoundation                      0x2f224a89 <redacted> + 176  

    7. <span style="color:#FF0000;"> 3   TestCrash                           0x000e8077 -[TestViewController crashTapped:] + 126</span>  

    8.     4   UIKit                               0x31b3f057 <redacted> + 90  

    9.     5   UIKit                               0x31b3eff7 <redacted> + 30  

    10.     6   UIKit                               0x31b3efd1 <redacted> + 44  

    11.     7   UIKit                               0x31b2a737 <redacted> + 374  

    12.     8   UIKit                               0x31b3ea4f <redacted> + 590  

    13.     9   UIKit                               0x31b3e721 <redacted> + 528  

    14.     10  UIKit                               0x31b396eb <redacted> + 758  

    15.     11  UIKit                               0x31b0e8ed <redacted> + 196  

    16.     12  UIKit                               0x31b0cf97 <redacted> + 7102  

    17.     13  CoreFoundation                      0x2f2b925b <redacted> + 14  

    18.     14  CoreFoundation                      0x2f2b872b <redacted> + 206  

    19.     15  CoreFoundation                      0x2f2b6f1f <redacted> + 622  

    20.     16  CoreFoundation                      0x2f221f0f CFRunLoopRunSpecific + 522  

    21.     17  CoreFoundation                      0x2f221cf3 CFRunLoopRunInMode + 106  

    22.     18  GraphicsServices                    0x3417a663 GSEventRunModal + 138  

    23.     19  UIKit                               0x31b6d16d UIApplicationMain + 1136  

    24.     20  TestCrash                           0x000e810d main + 116  

    25.     21  libdyld.dylib                       0x3a073ab7 <redacted> + 2  

    26. )  


    版权声明:本文博主原创文章。博客,未经同意不得转载。

  • 相关阅读:
    AX ERROR: Could not find my mock parent, most likely I am stale 不及格的程序员
    利用Segue在视图控制器间传值的问题 不及格的程序员
    Creating a Singleton Instance 不及格的程序员
    iPad 通知 UIKeyboardWillShowNotification 不会在keyBoard处在Undock状态下接到通知 不及格的程序员
    Why RootViewController's view is rotated Automatically by System when the app first loaded? 不及格的程序员
    如何弹出UIDatePicker最好 不及格的程序员
    jQuery开始做恶了 不及格的程序员
    what is the SEL,id and IMP,Class ,Method? 不及格的程序员
    Objectivec 字符串比较的陷井 不及格的程序员
    Unable to create any keyboard shortcuts after the iOS 6.1.3 update on iPad. 不及格的程序员
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4912069.html
Copyright © 2011-2022 走看看