开发者

iPhone crash on CoreData save

This is a different situation than this question, as the solution provided doesn't work and the stack is different.

Periodical crash when I save data using coredata.

The stack trace isn't 100% clear on where this is happening, but I'm certain it's this routine that's being called. It's either the save: in this method or the one following.

Code:

-(void)saveWine {
    if ([self validInfo]) {
        Wine *wine =  (Wine *)wineToEdit;
        if (wine == nil) {
            wine = (Wine *)[NSEntityDescription insertNewObjectForEntityForName:@"Wine" inManagedObjectContext:self.managedObjectContext];
        }
        wine.uuid = [Utils createUUID];
        wine.name = self.wineNameField.text;
        wine.vineyard = self.vineyardField.text;
        wine.vintage = [[self numberFormatter] numberFromString:self.vintageField.text];
        wine.timeStamp = [NSDate date];
        wine.rating = [NSNumber numberWithInt:self.ratingControl.selectedSegmentIndex];
        wine.partnerRating = [NSNumber numberWithInt:self.partnerRatingControl.selectedSegmentIndex];
        wine.varietal = self.currentVarietal;
        wine.tastingNotes = self.currentTastingNotes;
        wine.dateTasted = self.currentDateTasted;
        wine.tastingLocation = [[ReferenceDataAccessor defaultReferenceDataAccessor] addEntityForType:TASTING_LOCATION 
                                                                                             withName:self.currentWhereTasted];

        id type = [[ReferenceDataAccessor defaultReferenceDataAccessor] entityForType:WINE_TYPE 
                                                                          withOrdinal:self.typeC开发者_Go百科ontrol.selectedSegmentIndex];
        wine.type = type;
        NSError *error;
        NSLog(@"Saving %@",wine);
        if (![self.managedObjectContext save:&error]) {
            [Utils showAlertMessage:@"There was a problem saving your wine; try restarting the app" withTitle:@"Problem saving"];
            NSLog(@"Error while saving new wine %@, %@", error, [error userInfo]);
        }
    }
    else {
        NSLog(@"ERROR - someone is calling saveWine with invalid info!!");
    }
}

Code for addEntityForType:withName::

-(id)addEntityForType:(NSString *)type withName:(NSString *)name {

    if ([Utils isStringBlank:name]) {
        return nil;
    }
    id existing = [[ReferenceDataAccessor defaultReferenceDataAccessor] entityForType:type withName:name];

    if (existing != nil) {
        NSLog(@"%@ with name %@ already exists",type,name);
        return existing;
    }


    NSManagedObject *newEntity = [NSEntityDescription insertNewObjectForEntityForName:type 
                                                               inManagedObjectContext:self.managedObjectContext];

    [newEntity setValue:name forKey:@"name"];

    NSError *error;
    if (![self.managedObjectContext save:&error]) {
        [Utils showAlertMessage:[NSString stringWithFormat:@"There was a problem saving a %@",type] withTitle:@"Database Probem"];
        [Utils logErrorFully:error forOperation:[NSString stringWithFormat:@"saving new %@",type ]];
    }
    return newEntity;
}

Stack trace:

Thread 0 Crashed:
0   libSystem.B.dylib               0x311de2d4 __kill + 8
1   libSystem.B.dylib               0x311de2c4 kill + 4
2   libSystem.B.dylib               0x311de2b6 raise + 10
3   libSystem.B.dylib               0x311f2d72 abort + 50
4   libstdc++.6.dylib               0x301dea20 __gnu_cxx::__verbose_terminate_handler() + 376
5   libobjc.A.dylib                 0x319a2594 _objc_terminate + 104
6   libstdc++.6.dylib               0x301dcdf2 __cxxabiv1::__terminate(void (*)()) + 46
7   libstdc++.6.dylib               0x301dce46 std::terminate() + 10
8   libstdc++.6.dylib               0x301dcf16 __cxa_throw + 78
9   libobjc.A.dylib                 0x319a14c4 objc_exception_throw + 64
10  CoreData                        0x3526e83e -[NSManagedObjectContext save:] + 1098
11  Wine Brain                      0x0000651e 0x1000 + 21790
12  Wine Brain                      0x0000525c 0x1000 + 16988
13  Wine Brain                      0x00004894 0x1000 + 14484
14  Wine Brain                      0x00008716 0x1000 + 30486
15  CoreFoundation                  0x31477fe6 -[NSObject(NSObject) performSelector:withObject:withObject:] + 18
16  UIKit                           0x338c14a6 -[UIApplication sendAction:to:from:forEvent:] + 78
17  UIKit                           0x3395c7ae -[UIBarButtonItem(UIInternal) _sendAction:withEvent:] + 86
18  CoreFoundation                  0x31477fe6 -[NSObject(NSObject) performSelector:withObject:withObject:] + 18
19  UIKit                           0x338c14a6 -[UIApplication sendAction:to:from:forEvent:] + 78
20  UIKit                           0x338c1446 -[UIApplication sendAction:toTarget:fromSender:forEvent:] + 26
21  UIKit                           0x338c1418 -[UIControl sendAction:to:forEvent:] + 32
22  UIKit                           0x338c116a -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 350
23  UIKit                           0x338c19c8 -[UIControl touchesEnded:withEvent:] + 336
24  UIKit                           0x338b734e -[UIWindow _sendTouchesForEvent:] + 362
25  UIKit                           0x338b6cc8 -[UIWindow sendEvent:] + 256
26  UIKit                           0x338a1fc0 -[UIApplication sendEvent:] + 292
27  UIKit                           0x338a1900 _UIApplicationHandleEvent + 5084
28  GraphicsServices                0x35d66efc PurpleEventCallback + 660
29  CoreFoundation                  0x314656f8 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 20
30  CoreFoundation                  0x314656bc __CFRunLoopDoSource1 + 160
31  CoreFoundation                  0x31457f76 __CFRunLoopRun + 514
32  CoreFoundation                  0x31457c80 CFRunLoopRunSpecific + 224
33  CoreFoundation                  0x31457b88 CFRunLoopRunInMode + 52
34  GraphicsServices                0x35d664a4 GSEventRunModal + 108
35  GraphicsServices                0x35d66550 GSEventRun + 56
36  UIKit                           0x338d5322 -[UIApplication _run] + 406
37  UIKit                           0x338d2e8c UIApplicationMain + 664
38  Wine Brain                      0x000021ba 0x1000 + 4538
39  Wine Brain                      0x00002184 0x1000 + 4484

I have no idea why my app's memory locations aren't being symbolocated, but the code paths lead to only two manavedObjectContext save: calls. The time this happend, addEntityForType was called all the way through, creating a new object for the "whereTasted" entity, before the final save: on the entire wine object.

When I go through the same procedure again, it works fine. This leads me to believe it's something to do with the app having been run for a while when adding a new location, but I'm not sure.

Any thoughts on how I can debug this and get more info the next time this happens?


put @try - @catch around your save calls. There seems to be an exception thrown while saving:

9 libobjc.A.dylib 0x319a14c4 objc_exception_throw + 64

Sample:

@try
{
    if (![self.context save:&error]) {
        [[NSApplication sharedApplication] presentError:error];

}
@catch (NSException * e)
{
    NSLog(@"exception saving: %@", e);
    abort();
}


You should try to activate "Run > Stop on Objective-C exception". It allowed me to find the place where there was an access to an object turned into fault which was the root cause of the problem. (This was advice that recently worked very well for me. Thanks to Kamchatka.)

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜