【问题标题】:NSKeyedUnarchiver SIGBUS BUS_ADRALN crashNSKeyedUnarchiver SIGBUS BUS_ADRALN 崩溃
【发布时间】:2012-09-04 03:23:24
【问题描述】:

我使用以下方法在 NSFileWrapper 中解压缩数据,这种方法通常效果很好:

- (id)decodeObjectFromWrapperWithPreferredFilename:(NSString *)p {

    NSFileWrapper *wrapper = [self.fileWrapper.fileWrappers objectForKey:p];
    if (!wrapper) {
        NSLog(@"Unexpected error: Couldn't find %@ in file wrapper!", p);
        return nil;
    }

    NSData *data = [wrapper regularFileContents];
    NSKeyedUnarchiver *unarchiver;
    @try {
        unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
    }
    @catch (NSException *exception) {
        NSLog(@"exception: %@", exception);
        [TestFlight passCheckpoint:@"FILE LOADING EXCEPTION!"];
        UIAlertView *alertOFF = [[UIAlertView alloc]
                                 initWithTitle:@"Corrupt"
                                 message:@"There was an error loading a file! Please contact m@meernotes.com"
                                 delegate:self
                                 cancelButtonTitle:@"OK"
                                 otherButtonTitles:nil];
        [alertOFF show];

    }
    return [unarchiver decodeObjectForKey:@"data"];
}

但是,我偶尔会遇到unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; 行的 SIGBUS 崩溃。我猜我的异常处理程序没有捕获到这种类型的异常?我该如何处理此类异常以及导致它们的原因?

这是 Crashlytics 崩溃报告:

Exception Type:SIGBUSCode:BUS_ADRALN
Thread 0 Crashed
Latest Crash: 11 September 2012 at 06:23
0    Foundation 
-[NSKeyedUnarchiver initForReadingWithData:] + 389
1    Meernotes ✭     FRNBDocument.m line 221
-[FRNBDocument decodeObjectFromWrapperWithPreferredFilename:] + 221
2    Meernotes   FRNBDocument.m line 155
-[FRNBDocument settings] + 155
3    Meernotes   ModelController.m line 497
__39-[ModelController previewLoadDocAtURL:]_block_invoke_0 + 497
4
...
libdispatch.dylib   
_dispatch_barrier_sync_f_slow_invoke + 78
5    libdispatch.dylib  
_dispatch_main_queue_callback_4CF$VARIANT$up + 196
6    CoreFoundation 
__CFRunLoopRun + 1268
7    CoreFoundation 
CFRunLoopRunSpecific + 300
8    CoreFoundation 
CFRunLoopRunInMode + 104
9    GraphicsServices   
GSEventRunModal + 136
10   UIKit  
UIApplicationMain + 1080
11   Meernotes   main.m line 16
main + 16

【问题讨论】:

    标签: ios crash nskeyedarchiver nsfilewrapper sigbus


    【解决方案1】:

    首先,您确定这是整个崩溃报告吗?应该有更多的细节...

    无论如何,这也不例外。这是一个信号,通常意味着内存访问错误。如果您收到 SIGBUS,则基本上意味着内存错误(通常来自您的代码访问错误的指针)。

    在您的情况下,最可能的罪魁祸首是您从 [wrapper regularFileContents] 收到的数据对象在某种程度上已损坏。很可能,它返回 nil。

    注意regularFileContents的文档:

    讨论

    如果用户在您修改文件后,此方法可能会返回 nil 调用 readFromURL:options:error: 或 initWithURL:options:error: 但是 在 NSFileWrapper 读取文件内容之前。使用 NSFileWrapperReadingImmediate 读取选项以减少可能性 那个问题。

    这就是我要开始的地方。也有可能是文件数据已损坏,解压器因错误数据而窒息。

    基本上,这不是您可以捕获和忽略的异常。它表示您的程序中存在必须修复的错误。

    【讨论】:

    • 另外,你应该改变'return [unarchiver decodeObjectForKey:@"data"];'将此对象放在临时对象中,然后根据类文档向解档器发送“完成解码”消息,然后返回临时对象。
    猜你喜欢
    • 2016-09-22
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    • 2015-10-11
    • 2018-06-17
    • 2011-08-07
    • 2011-11-25
    • 1970-01-01
    相关资源
    最近更新 更多