zoukankan      html  css  js  c++  java
  • 捕获软件异常,再次运行时发送到服务器

      在我们开发的app中, 不可避免的, 有时候用户使用软件会崩溃.  我们就需要捕获异常, 可以在入口类中加入相应的代码, 可以在每次用户打开程序的时候, 检查一下沙盒中是否有崩溃日志, 如果有, 可以发送给服务器, 方便改进软件. 

      

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

    {

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

        self.window.backgroundColor = [UIColor whiteColor];

        [self.window makeKeyAndVisible];

        

      

        // 这里反馈给服务器

     

        self.window.rootViewController = [ViewController new];

        return YES;

    }

    宏定义

    ExceptionHandler  捕获异常的宏定义

    #define ExceptionHandler [ZYExceptionHandler caughtExceptionHandler];

     

    #import "ZYExceptionHandler.h"

    #include <libkern/OSAtomic.h>

    #include <execinfo.h>

    @implementation ZYExceptionHandler

     

    + (void)caughtExceptionHandler{

        //指定crash的处理方法。

        NSSetUncaughtExceptionHandler(& UncaughtExceptionHandler);

    }

     

    + (void)fileCreate{

        NSString *path = [ZYExceptionHandler exceptionPath];

        NSFileManager *manager =[NSFileManager defaultManager];

        //文件不存在时创建

        if (![manager fileExistsAtPath:path])

        {

            NSString *dateString = [ZYExceptionHandler currentTime];

            NSString *logStr = [NSString stringWithFormat:@"================ 文件创建时间:%@ ================",dateString];

            NSData *data = [logStr dataUsingEncoding:NSUTF8StringEncoding];       

            [data writeToFile:path atomically:YES];

        }

    }

     

    void UncaughtExceptionHandler(NSException *exception) {

        /**

         *  获取异常崩溃信息

         */

        //在这里创建一个接受crash的文件

        [ZYExceptionHandler fileCreate];

     

        NSArray *callStack = [exception callStackSymbols];

        NSString *reason = [exception reason];

        NSString *name = [exception name];

        NSString *dateString = [ZYExceptionHandler currentTime];

        NSString *systemName = [[UIDevice currentDevice] systemName];

        NSString *strModel = [[UIDevice currentDevice] model];

        NSDictionary* infoDict =[[NSBundle mainBundle] infoDictionary];

        NSString *bundleIdentifier = infoDict[@"CFBundleIdentifier"];

        NSString* versionNum = [infoDict objectForKey:@"CFBundleShortVersionString"];

        

        NSString *content = [NSString stringWithFormat:@" ========异常错误报告======== 错误时间:%@ 系统:%@ 设备:%@ 当前版本:%@ 当前唯一标示符:%@ 错误名称:%@ 错误原因: %@ callStackSymbols: %@ ========异常错误结束======== ",dateString,systemName,strModel,versionNum,bundleIdentifier,name,reason,[callStack componentsJoinedByString:@" "]];

     

        NSString *path = [ZYExceptionHandler exceptionPath];

     

        NSFileHandle *outFile = [NSFileHandle fileHandleForWritingAtPath:path];

        //找到并定位到outFile的末尾位置(在此后追加文件)

        [outFile seekToEndOfFile];

        

        [outFile writeData:[content dataUsingEncoding:NSUTF8StringEncoding]];

        //关闭读写文件

        [outFile closeFile];   

    }

    + (NSString *)exceptionPath{

        

        NSLog(@"----->>>%@",NSHomeDirectory());

        

        NSString *documents = [NSHomeDirectory()stringByAppendingPathComponent:@"Documents"];

        NSString *path = [documents stringByAppendingPathComponent:@"exceptionHandler.txt"];

        

        return path;

    }

    + (NSString *)currentTime{

        NSDate *date = [NSDate date];

        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];

        [formatter setDateFormat:@"yyyy-MM-dd hh:mm"];

        NSString *dateString = [formatter stringFromDate:date];

        return dateString;

     

    }

    //获取调用堆栈

    + (NSArray *)backtrace

    {

        void* callstack[128];

        int frames = backtrace(callstack, 128);

        char **strs = backtrace_symbols(callstack,frames);

        

        NSMutableArray *backtrace = [NSMutableArray arrayWithCapacity:frames];

        for (int i=0;i<frames;i++)

        {

            [backtrace addObject:[NSString stringWithUTF8String:strs[i]]];

        }

        free(strs);

        return backtrace;

    }

  • 相关阅读:
    Interviewe(hdu3486)
    Cornfields(poj2019)
    C. Watching Fireworks is Fun(Codeforces 372C)
    A. Points on Line
    Fence(poj1821)
    7
    如何使用Visual Studio调试C#程序
    do…while语句
    通过ASP.NET Ajax技术模拟实现NBA比赛文字直播功能
    RecyclerView的基础用法
  • 原文地址:https://www.cnblogs.com/cdp-snail/p/4967526.html
Copyright © 2011-2022 走看看