SIGSEGV : Sporadic crash issue

2019-09-17 08:26发布

问题:

Here is my first attempt to solve crash issue in iOS app. Sharing some crash logs here.

Exception Type:  SIGSEGV
Exception Codes: SEGV_ACCERR at 0x97ad6beb8
Crashed Thread:  11

Application Specific Information:
objc_msgSend() selector name: length

and here is my 11th thread.

Thread 11 Crashed:
0   libobjc.A.dylib                      0x0000000180558150 objc_msgSend + 16
1   Foundation                           0x00000001824f3f60 -[NSString compare:] + 28
2   Foundation                           0x00000001824d88e0 _NSCompareObject + 60
3   CoreFoundation                       0x0000000181a99bd0 __CFSimpleMergeSort + 88
4   CoreFoundation                       0x0000000181a99c60 __CFSimpleMergeSort + 232
5   CoreFoundation                       0x0000000181a99c60 __CFSimpleMergeSort + 232
6   CoreFoundation                       0x0000000181a99c60 __CFSimpleMergeSort + 232
7   CoreFoundation                       0x0000000181a99c60 __CFSimpleMergeSort + 232
8   CoreFoundation                       0x0000000181a99c60 __CFSimpleMergeSort + 232
9   CoreFoundation                       0x0000000181a99c60 __CFSimpleMergeSort + 232
10  CoreFoundation                       0x0000000181a99c60 __CFSimpleMergeSort + 232
11  CoreFoundation                       0x0000000181a99c60 __CFSimpleMergeSort + 232
12  CoreFoundation                       0x0000000181a99c60 __CFSimpleMergeSort + 232
13  CoreFoundation                       0x0000000181a99c60 __CFSimpleMergeSort + 232
14  CoreFoundation                       0x0000000181a99c60 __CFSimpleMergeSort + 232
15  CoreFoundation                       0x00000001819c585c CFSortIndexes + 460
16  CoreFoundation                       0x00000001819c6f9c CFMergeSortArray + 372
17  Foundation                           0x00000001824d80e8 _sortedObjectsUsingDescriptors + 568
18  Foundation                           0x00000001825c64e0 -[NSSet(NSKeyValueSorting) sortedArrayUsingDescriptors:] + 536
19  Eikon                                0x0000000100198b98 __51-[EIKNewsHeadlineStoreManager saveHeadlines:block:]_block_invoke (EIKNewsHeadlineStoreManager.m:67)
20  CoreData                             0x0000000183e5e214 developerSubmittedBlockToNSManagedObjectContextPerform + 148
21  libdispatch.dylib                    0x000000018099a9a0 _dispatch_client_callout + 12
22  libdispatch.dylib                    0x00000001809a8ad4 _dispatch_queue_serial_drain + 924
23  libdispatch.dylib                    0x000000018099e2cc _dispatch_queue_invoke + 880
24  libdispatch.dylib                    0x00000001809a8fa8 _dispatch_queue_override_invoke + 340
25  libdispatch.dylib                    0x00000001809aaa50 _dispatch_root_queue_drain + 536
26  libdispatch.dylib                    0x00000001809aa7d0 _dispatch_worker_thread3 + 120
27  libsystem_pthread.dylib              0x0000000180ba31d0 _pthread_wqthread + 1092
28  libsystem_pthread.dylib              0x0000000180ba2d7c start_wqthread + 0

What i am trying to do is get some news headlines from server every 5 or 10 secs, sort them in some order using NSSortDescriptors and then store them in my CoreData. And that is what exactly saveHeadlines:block method is doing inside my class.

What exactly objc_msgSend() selector name: length mean here? Any help is appreciated.

Note: Its a sporadic issue. When i test in simulator or my devices its not crashing. But some users of our app are reporting this crash.

Edited question: inside saveHeadlines:block method

        __weak typeof(self) weakSelf = self;
    [self.privateMOC performBlock:^{

        NSMutableArray *newsTopics = [[EIKNewsTopicStoreManager managedObjectsInManagedObjectContext:self.privateMOC] mutableCopy];
        [newsTopics addObjectsFromArray:[EIKNewsTopicStoreManager topicsManagedObjectForNewsFeedInContext:self.privateMOC]];
        weakSelf.storedHeadlines = [NSMutableSet set];

        for (NSManagedObject *storedTopic in newsTopics) {
            [weakSelf.storedHeadlines addObjectsFromArray:[[storedTopic valueForKey:EIKFeedTopicRelationshipItems] allObjects]];
        }

        NSArray *sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:EIKNewsHeadlineAttributeHeadlineId ascending:YES]];
        NSArray *orderedItems = [items sortedArrayUsingDescriptors:sortDescriptors];
        NSArray *orderedHeadlines = [weakSelf.storedHeadlines sortedArrayUsingDescriptors:sortDescriptors];

And the crash is happening on the last line. i.e

 NSArray *orderedHeadlines = [weakSelf.storedHeadlines sortedArrayUsingDescriptors:sortDescriptors];

Not able to figure out why.!

My NSManagedObjectContext is initialised like this[i.e privateMOC as shown in above code]

NSManagedObjectContext *confinementContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];

回答1:

Not much info here, but it looks to me that NSManagedObjectContext isn't valid on the thread you are performing your operation. Please make sure that you perform all operations on the context's private queue. You can do this for example by using performBlock: or performBlockAndWait:. Also you can't reuse instances of NSManagedObject on different threads than the one you fetched them on. Hope that helps.