美文网首页开发遇到的问题iOS进阶常用方法
iOS崩溃统计 - Bugly接入与填坑

iOS崩溃统计 - Bugly接入与填坑

作者: 策马鞭程 | 来源:发表于2016-09-22 16:51 被阅读4205次

    1.接入

    1.下载SDK,导入库.(此处有坑)
    官方缺少了libc++.tbd
    2.接下来就顺利了

    2.上传符号表

    1.什么是符号表?
    符号表是内存地址与函数名、文件名、行号的映射表。符号表元素如下所示:
    <起始地址> <结束地址> <函数> [<文件名:行号>]

    2.为什么要配置符号表?
    为了能快速并准确地定位用户APP发生Crash的代码位置,Bugly使用符号表对APP发生Crash的程序堆栈进行解析和还原。
    如下:


    默认Debug模式,是不会生成dSYM文件,需要开启.重新编译CMD+B


    开启dSYM文件生成

    生成后,在哪里可以找到dSYM文件?

    QQ20160922-1.png

    手动上传dSYM文件
    把dSYM文件压缩成zip文件,在网页上上传


    第一步 第二步

    上传压缩dSYM文件成.zip的文件即可.

    例子:
    上传前:


    上传后:


    官方文档链接:https://bugly.qq.com/docs/user-guide/symbol-configuration-ios/?v=20160920110805

    后续:(保存log到本地,并上传到Bugly管理后台)

    异常回调处理
    1.遵守代理协议<BuglyDelegate>

    2.设置代理对象
    BuglyConfig *config = [[BuglyConfig alloc] init];
    config.delegate = self;
    [Bugly startWithAppId:@"******" config:config];

    3.实现代理方法attachmentForException

    #pragma mark - Bugly代理 - 捕获异常,回调(@return 返回需上报记录,随 异常上报一起上报)
    - (NSString *)attachmentForException:(NSException *)exception {
        
        #ifdef DEBUG // 调试
        return [NSString stringWithFormat:@"我是携带信息:%@",[self redirectNSLogToDocumentFolder]];
        #endif
        
        return nil;
    }
    
    #pragma mark - 保存日志文件
    - (NSString *)redirectNSLogToDocumentFolder{
        //如果已经连接Xcode调试则不输出到文件
        if(isatty(STDOUT_FILENO)) {
            return nil;
        }
        UIDevice *device = [UIDevice currentDevice];
        if([[device model] hasSuffix:@"Simulator"]){
            //在模拟器不保存到文件中
            return nil;
        }
        //获取Document目录下的Log文件夹,若没有则新建
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *logDirectory = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"Log"];
        NSFileManager *fileManager = [NSFileManager defaultManager];
        BOOL fileExists = [fileManager fileExistsAtPath:logDirectory];
        if (!fileExists) {
            [fileManager createDirectoryAtPath:logDirectory  withIntermediateDirectories:YES attributes:nil error:nil];
        }
        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        [formatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"]];
        [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; //每次启动后都保存一个新的日志文件中
        NSString *dateStr = [formatter stringFromDate:[NSDate date]];
        NSString *logFilePath = [logDirectory stringByAppendingFormat:@"/%@.txt",dateStr];
        // freopen 重定向输出输出流,将log输入到文件
        freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding], "a+", stdout);
        freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding], "a+", stderr);
        
        return [[NSString alloc] initWithContentsOfFile:logFilePath encoding:NSUTF8StringEncoding error:nil];
        
    }
    

    更多高级功能参考官方文档
    https://bugly.qq.com/docs/user-guide/advance-features-ios/?v=20160930152416

    /**
     *  上报自定义异常
     *
     *  @param exception 异常信息
     */
    + (void)reportException:(nonnull NSException *)exception;
    
    /**
     *  上报错误
     *
     *  @param error 错误信息
     */
    + (void)reportError:(NSError *)error;
    
    /**
     *    @brief 上报自定义错误
     *
     *    @param category    类型(Cocoa=3,CSharp=4,JS=5,Lua=6)
     *    @param aName       名称
     *    @param aReason     错误原因
     *    @param aStackArray 堆栈
     *    @param info        附加数据
     *    @param terminate   上报后是否退出应用进程
     */
    + (void)reportExceptionWithCategory:(NSUInteger)category name:(NSString *)aName reason:(NSString *)aReason callStack:(NSArray *)aStackArray extraInfo:(NSDictionary *)info terminateApp:(BOOL)terminate;
    

    相关文章

      网友评论

      • 顺情风:楼主写的很好,但是这个dSYM文件压缩包上传,其实是发生异常后根据网页提示版本号对应上传“dSYM文件压缩包”,不是一次上传永远好用,也不是需要一直上传,而是看到异常想要看具体哪行报错时候在那个异常里面上传“dSYM文件压缩包”。这一点希望你编辑你的文章进行修改。
      • 独木舟的木:请问
        - (NSString *)attachmentForException:(NSException *)exception { } 这个方法返回到数据在哪里看啊,有人说是在跟踪数据的附件信息里,我测试的时候,并没有看到。
      • 纠结的哈士奇:请教一下 ,你这种的上传符号表方式(就是直接取本地.dSYM压缩上传),这种有效么?
        官方文档写的不清不楚,好多地方要借助于那个脚本和本地java服务器.jar上传,我都迷糊了。

        望指教。
      • 童话镇里蜿蜒的河:楼主你好 上传的符号表好像不对? 你好像两次都上传了dsym文件。你的符号表JAR并没在文档中提现?
        CocoaH:你好,除了在appdelegate 里面设置 appkey 还需要别的别的设置吗?我的崩溃信息不上传
        策马鞭程:保留着符号表文件就行了,需要时上传.
        策马鞭程:我一般都不上传:smile:

      本文标题:iOS崩溃统计 - Bugly接入与填坑

      本文链接:https://www.haomeiwen.com/subject/xnpzettx.html