• 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. )  


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

  • 相关阅读:
    activiti 用户手册中 10分钟 小例子 简单代码搭建 及 其中的 各种坑
    Eclipse启动项目正常,放到tomcat下单独启动就报错的 一例
    Project facet jst.web.jstl has not been defined.
    MySQL删除所有表的外键约束、禁用外键约束
    Unsupported major.minor version 52.0解决办法
    Could not update Activiti database schema: unknown version from database: '5.20.0.1'
    Android SDK下载地址
    Unity3d游戏中添加移动MM支付SDK问题处理
    Unity3d集成移动MM SDK 2.2的技术要点(坑爹的MM SDK)
    Android SDK更新 Connection to http://dl-ssl.google.com refused 解决方法
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4912069.html
Copyright © 2020-2023  润新知