NSDictionary allKeys аварийно завершает работу - не может понять обстоятельства отчета о сбое - PullRequest
5 голосов
/ 06 марта 2012

У меня есть следующий код:

- (Item *) getRandomItem {
    if (itemIDs == nil) {
        [self parse];
    }
    NSArray * allKeys = [allItems allKeys];
    int seed = arc4random()%[allKeys count];
    return [self getItemByID:[allKeys objectAtIndex:seed]];
}

Иногда происходит сбой в реальном приложении, но мы не можем воспроизвести сбой.Я пытался проанализировать отчет и понять, что может быть причиной аварии, но у меня ничего не получилось.Любой способ, которым я пытаюсь изменить объект allItems, чтобы вызвать сбой, приводит к ошибке, отличной от той, о которой сообщалось здесь.

Мне нужна помощь в понимании, при каких обстоятельствах произойдет следующее падение:

Hardware Model:      iPhone3,1
Code Type:       ARM (Native)
Parent Process:  launchd [1]
OS Version:      iPhone OS 5.0.1 (9A405)
Report Version:  104
Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x00000010
Crashed Thread:  0

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   libobjc.A.dylib                 0x3427eb30 _class_isInitialized
1   libobjc.A.dylib                 0x3427e8d6 _class_initialize
2   libobjc.A.dylib                 0x3427e88e prepareForMethodLookup
3   libobjc.A.dylib                 0x3427e76a lookUpMethod
4   libobjc.A.dylib                 0x3427e008 objc_msgSend_uncached
5   CoreFoundation                  0x33f7c020 CFRetain
6   CoreFoundation                  0x33f85bac +[__NSArrayI __new::]
7   CoreFoundation                  0x33f85ac6 -[__NSPlaceholderArray initWithObjects:count:]
8   CoreFoundation                  0x33f85806 +[NSArray arrayWithObjects:count:]
9   CoreFoundation                  0x33fa0e92 -[NSDictionary allKeys]
10  AClockworkBrain                 0x0008f46e -[ItemManager getRandomItem] (ItemManager.m:360)
......

Спасибо.

Ответы [ 2 ]

9 голосов
/ 06 марта 2012
Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   libobjc.A.dylib                 0x3427eb30 _class_isInitialized
1   libobjc.A.dylib                 0x3427e8d6 _class_initialize
2   libobjc.A.dylib                 0x3427e88e prepareForMethodLookup
3   libobjc.A.dylib                 0x3427e76a lookUpMethod
4   libobjc.A.dylib                 0x3427e008 objc_msgSend_uncached
5   CoreFoundation                  0x33f7c020 CFRetain
6   CoreFoundation                  0x33f85bac +[__NSArrayI __new::]
7   CoreFoundation                  0x33f85ac6 -[__NSPlaceholderArray initWithObjects:count:]

Этот сбой является признаком чрезмерного выпуска или повреждения.В частности, один из ключей в вашем словаре был переиздан и / или поврежден.В частности, указатель isa теперь указывает на мусор.

Когда allKeys пытается создать временный массив всех ключей, он пытается сохранить поврежденный объект (через CFRetain, но обрабатывает егокак звонок на retain).Среда выполнения не распознает указатель isa как инициализированный класс (потому что он указывает на мусор) и пытается вызвать initialize для этого «класса», что приводит к падению.

ТеперьБывает, что поврежденный isa, скорее всего, является значением, которое указывает на читабельное, но мусор, меню и приводит к падению на несколько уровней глубоко во время выполнения.Чаще всего это происходит потому, что объект был перевыпущен, а затем какая-то структура оказалась malloc () 'd в том же месте, и эта структура имеет указатель в качестве первой записи, что является полностью распространенным шаблоном для структур.

Чтобы исправить?

Сначала запустите анализатор и исправьте все проблемы, к которым он предъявляет жалобы.

Затем проверьте все случаи использования объектов, которые являются ключами в этом словаре.Посмотрите, сможете ли вы найти, где может произойти перепроизводство.

Наконец, попробуйте включить зомби и посмотреть, сможете ли вы воспроизвести аварию.

0 голосов
/ 06 марта 2012

это поможет, если вы это сделаете?

NSArray * allKeys = [NSArray arrayWithArray:[allItems allKeys]];
...