Сбой ABPeoplePicker только для одного человека - PullRequest
0 голосов
/ 07 декабря 2010

У меня есть приложение, которое дает сбой только одному из моих тестеров - никому другому.Но это терпит крах последовательно для нее.Это очень странно.

Подробности:
У нее в iPhone 4 и iPhone 3Gs
Приложение вылетает на всех ОС на обоих телефонах
Приложение вылетает со всеми контактами, какими бы они ни былисозданный
Когда она отправляет мне свои контакты, они отлично работают как на моем iPHone 4, так и на моем 3G (не)
Она ЕДИНСТВЕННАЯ, которая когда-либо получает сбой, и она совместима как на телефонах, так и на всех ОС
Она удалила и переустановила приложение и профиль обеспечения
Она синхронизирует свой iPhone с версией iTunes для Windows-машины

Сбой происходит, когда мы используем ABPeoplePicker.
С ее точки зрения это выглядит такВ ту минуту, когда она выбирает номер телефона, приложение выходит из строя.Конечно, она не в нашем приложении в данный момент.Она находится в навигационном представлении ABPeoplePicker, предоставленном Apple.Из повторно загруженного журнала сбоев мне кажется, что он на самом деле падает, когда пытается вернуться в наше приложение.Другими словами, я не могу найти никаких упоминаний о том, что наше приложение действительно несет ответственность за сбой в журнале аварий (см. Ниже).Похоже, что он не может получить индекс выбранного номера телефона, а затем не удается при попытке вернуться в наше приложение, но в лучшем случае это предположение.Я прочитал документы Apple и постарался сделать все возможное, чтобы узнать, как читать журналы сбоев, но я все еще в замешательстве.Вот мои вопросы:
1. Кто-нибудь знает, что означают коды исключений: 0x00000000, 0x00000000?
2. Правильно ли я считаю, что в строке 9 указаны фактические проблемы?И если да, то как я могу понять, что означает objc_exception_throw + 64?
3. Может кто-нибудь пролить свет на то, что в этом журнале сбоев говорится о проблеме?

Incident Identifier: 
CrashReporter Key:   
Hardware Model:      iPhone3,1
Process:         My App [471]
Path:            
Identifier:      My App
Version:         ??? (???)
Code Type:       ARM (Native)
Parent Process:  launchd [1]

Date/Time:       2010-12-06 16:32:44.088 -0600
OS Version:      iPhone OS 4.0.2 (8A400)
Report Version:  104

Exception Type:  EXC_CRASH (SIGABRT)
Exception Codes: 0x00000000, 0x00000000
Crashed Thread:  0

Thread 0 Crashed:
0   libSystem.B.dylib              0x000791d0 __kill + 8
1   libSystem.B.dylib              0x000791c0 kill + 4
2   libSystem.B.dylib              0x000791b2 raise + 10
3   libSystem.B.dylib              0x0008d6fa abort + 50
4   libstdc++.6.dylib              0x00044a20 __gnu_cxx::__verbose_terminate_handler() + 376
5   libobjc.A.dylib                0x000059ec _objc_terminate + 104
6   libstdc++.6.dylib              0x00042df2 __cxxabiv1::__terminate(void (*)()) + 46
7   libstdc++.6.dylib              0x00042e46 std::terminate() + 10
8   libstdc++.6.dylib              0x00042f16 __cxa_throw + 78
9   libobjc.A.dylib                0x000048cc objc_exception_throw + 64
10  CoreFoundation                 0x0001fb72 -[__NSArrayI objectAtIndex:] + 154
11  My App                  0x00005a68 0x1000 + 19048
12  My App                  0x00005dec 0x1000 + 19948
13  UIKit                          0x000668f4 -[UIViewController view] + 104
14  UIKit                          0x000784e4 -[UIViewController contentScrollView] + 16
15  UIKit                          0x00078354 -[UINavigationController _computeAndApplyScrollContentInsetDeltaForViewController:] + 24
16  UIKit                          0x00078252 -[UINavigationController _layoutViewController:] + 18
17  UIKit                          0x00077d58 -[UINavigationController _startTransition:fromViewController:toViewController:] + 372
18  UIKit                          0x00077b68 -[UINavigationController _startDeferredTransitionIfNeeded] + 176
19  UIKit                          0x00066fa8 -[UINavigationController pushViewController:transition:forceImmediate:] + 600
20  UIKit                          0x00066d40 -[UINavigationController pushViewController:animated:] + 28
21  My App                  0x0000a29a 0x1000 + 37530
22  My App                  0x0000bcba 0x1000 + 44218
23  AddressBookUI                  0x00032cfc -[ABPeoplePickerNavigationController personViewController:shouldPerformDefaultActionForPerson:property:identifier:withMemberCell:] + 152
24  AddressBookUI                  0x0003b8ce -[ABPersonViewControllerHelper personTableViewDataSource:selectedPropertyAtIndex:inPropertyGroup:withMemberCell:forEditing:] + 222
25  AddressBookUI                  0x0004a17c -[ABPersonTableViewDataSource valueAtIndex:selectedForPropertyGroup:withMemberCell:forEditing:] + 40
26  AddressBookUI                  0x00048c00 -[ABPersonTableViewDataSource tableView:didSelectRowAtIndexPath:] + 316
27  UIKit                          0x00091f40 -[UITableView _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:] + 656
28  UIKit                          0x0009db40 -[UITableView _userSelectRowAtIndexPath:] + 124
29  Foundation                     0x00086c86 __NSFireDelayedPerform + 362
30  CoreFoundation                 0x00071a54 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 8
31  CoreFoundation                 0x00073ede __CFRunLoopDoTimer + 854
32  CoreFoundation                 0x0007485e __CFRunLoopRun + 1082
33  CoreFoundation                 0x0001d8e4 CFRunLoopRunSpecific + 224
34  CoreFoundation                 0x0001d7ec CFRunLoopRunInMode + 52
35  GraphicsServices               0x000036e8 GSEventRunModal + 108
36  GraphicsServices               0x00003794 GSEventRun + 56
37  UIKit                          0x000062a0 -[UIApplication _run] + 396
38  UIKit                          0x00004e10 UIApplicationMain + 664
39  My App                  0x0000d694 0x1000 + 50836
40  My App                  0x00002d00 0x1000 + 7424

Вот мой код ABPeoplePicker.

#pragma mark ABPeoplePickerNavigationControllerDelegate methods
// Displays the information of a selected person
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person
{
    return YES;
}

// Does not allow users to perform default actions such as dialing a phone number, when they select a person property.
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker 
    shouldContinueAfterSelectingPerson:(ABRecordRef)person 
                 property:(ABPropertyID)property 
                                  identifier:(ABMultiValueIdentifier)identifier {

     CFStringRef cfName = ABRecordCopyCompositeName(person);
     self.selectedName = [NSString stringWithString:(NSString *)cfName];
     CFRelease(cfName);

     ABMultiValueRef allThePhoneNums = ABRecordCopyValue(person, kABPersonPhoneProperty);

     // ABMultiValueGetIndexForIdentifier the exact value of the "identifier" passed to us.
     NSString *number = (NSString *)ABMultiValueCopyValueAtIndex(allThePhoneNums, ABMultiValueGetIndexForIdentifier(allThePhoneNums, identifier));

     self.selectedNumber = number;

     [number release];

     CFRelease(allThePhoneNums);

     [self showDialOutToPartViewControllerWithName:self.selectedName andNumber:self.selectedNumber];

     [peoplePicker dismissModalViewControllerAnimated:YES];

     return NO;
 }


 // Dismisses the people picker and shows the application when users tap Cancel. 
 - (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker; {
     [self dismissModalViewControllerAnimated:YES];
 }

1 Ответ

2 голосов
/ 07 декабря 2010

Прежде всего, это помогает символизировать ваши журналы сбоев, используя инструмент symbolicatecrash и файл DSYM, который был сгенерирован при его компиляции.Я не буду обсуждать, как это сделать здесь - вы можете искать в Google, чтобы найти более подробную информацию;попробуйте в качестве ключевых слов "символизировать журнал сбоев DSYM".

Как только вы это сделаете, вместо:

My App      0x0232032+433

Это покажет что-то вроде этого:проще найти строку кода, которая порождает проблему.

Однако - обратите внимание на трассировку стека, что последняя строка кода [array objectAtIndex:] в Foundation.Этот метод выдаст NSRangeException, когда вы передадите индекс за пределы получателя (например, массив).Из документов NSArray:

Если индекс находится за концом массива (то есть, если индекс больше или равен значению, возвращенному count), возникает исключение NSRangeException.

Итак, я бы положил свои деньги на то, что ты потерпел крушение.

Тогда возникает вопрос - после того, как вы символизируете свой журнал сбоев - какая строка вашего кода вызывает массив с индексом за пределами границ?

...