使用EXC_BAD_ACCESS进行iOS JSON解析崩溃

时间:2016-07-28 00:03:40

标签: ios objective-c json crashlytics

我们有一个与Crashlytics集成的实时应用。我们通过Crashlytics报告了一个罕见的崩溃...我们从来没有能够在调试器中复制它。最新版本是在Xcode 7.x中构建的,我们的部署目标是iOS 6.0,我们正在使用ARC。这是相关代码:

+(NSString*)stringFromItems:(NSArray*)items {
    NSMutableArray* array = [NSMutableArray arrayWithCapacity:[items count]];
    for (MyItem* item in items) {
        [array addObject:item.dictionary];
    }

    NSData* data = nil;
    @try {
        if (![NSJSONSerialization isValidJSONObject: array]) {
            NSLog(@"Tried to parse invalid JSON: %@", array);
            return nil;
        }

        NSError* error = nil;
        data = [NSJSONSerialization dataWithJSONObject:array options:0 error:&error];
        if (!data || error) {
            NSLog(@"Invalid input array: %@ resulted in serialization error: %@", items, [error localizedDescription]);
            return nil;
        }
    }
    @catch (NSException* exception) {
        NSLog(@"Exception during serialization: %@", exception);
        return nil;
    }

    return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}

以下是Crashlytics报告的堆栈跟踪:

EXC_BAD_ACCESS KERN_INVALID_ADDRESS 0x0000000000000018

0  Foundation                     0x182cdcf60 _convertJSONString + 284
1  Foundation                     0x182cdc39c _writeJSONString + 124
2  Foundation                     0x182cdafbc _writeJSONValue + 116
3  Foundation                     0x182cdd394 ___writeJSONObject_block_invoke + 236
4  CoreFoundation                 0x1821da44c __65-[__NSDictionaryI enumerateKeysAndObjectsWithOptions:usingBlock:]_block_invoke + 88
5  CoreFoundation                 0x1821c80f0 -[__NSDictionaryI enumerateKeysAndObjectsWithOptions:usingBlock:] + 224
6  Foundation                     0x182cdcb20 _writeJSONObject + 360
7  Foundation                     0x182cdb0d0 _writeJSONValue + 392
8  Foundation                     0x182cdd57c ___writeJSONArray_block_invoke + 144
9  CoreFoundation                 0x18217f944 __53-[__NSArrayM enumerateObjectsWithOptions:usingBlock:]_block_invoke + 132
10 CoreFoundation                 0x18217f7b4 -[__NSArrayM enumerateObjectsWithOptions:usingBlock:] + 172
11 Foundation                     0x182cdcd7c _writeJSONArray + 300
12 Foundation                     0x182cdb170 _writeJSONValue + 552
13 Foundation                     0x182cdaf00 -[_NSJSONWriter dataWithRootObject:options:error:] + 140
14 Foundation                     0x182cdbf5c +[NSJSONSerialization dataWithJSONObject:options:error:] + 348
15 MyAppName                      0x1000fd104 +[MyItem stringFromItems:] (MyItem.m:232)

因此对isValidJSONObject的调用成功,但是当我们尝试解析数组时,我们立即得到一个EXC_BAD_ACCESS,好像我们正在引用一个解除分配的对象(即使isValidJSONObject刚刚访问了数组字典中的所有相同对象)

我排除了大部分显而易见的答案...如果对象的任何问题都是问题,则isValidJSONObject返回false(非字符串键,非JSON可解析对象,如NSDate,NSNumber设置为NaN等) )。字典中的重复键会导致isValidJSONObject中出现EXC_BREAKPOINT异常。我们无法提出可能导致此特定崩溃的方案。

有人遇到过类似的东西吗?关于可能发生的事情的任何想法?非常感谢您的任何帮助!

0 个答案:

没有答案