我有一个应用程序,只有我的一个测试人员崩溃 - 没有其他人。但它一直为她崩溃。这很奇怪。
详细说明:
她拥有iPhone 4和iPhone 3Gs
该应用程序崩溃在两部手机上的所有操作系统上
无论创建方式如何,应用程序都会与所有联系人崩溃
当她向我发送她的联系人时,他们在我的iPHone 4和我的3G(非s)上工作正常
她是唯一一个遭遇崩溃的人,它在手机和所有操作系统上都是一致的
她已卸载并重新安装了应用程序和配置文件
她正在将她的iPhone与Windows机器版的iTunes同步
当我们使用ABPeoplePicker时发生崩溃
从她的角度看,它看起来就像她选择一个应用程序崩溃的电话号码。
当然她当时不在我们的应用程序中。她在Apple提供的ABPeoplePicker导航视图中。
从resymbolicated崩溃日志,它看起来像它在尝试返回我们的应用程序时实际上崩溃。换句话说,我找不到任何提及我们的应用实际上负责崩溃日志中的崩溃(见下文)。
看起来它无法获得所选电话号码的索引,然后在尝试弹回我们的应用程序时失败,但这是最好的猜测。
我已经阅读了Apple文档,并尝试尽职尽责地学习如何阅读崩溃日志,但我仍然感到难过。
以下是我的问题:
1.有谁知道异常代码:0x00000000,0x00000000表示什么?
2.假设第9行是涉及实际问题的地方,我是否正确?如果是这样,我如何理解objc_exception_throw + 64的含义?
任何人都可以了解这个崩溃日志说的问题是什么?
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];
}
答案 0 :(得分:2)
最重要的是,使用symbolicatecrash
工具和编译时生成的DSYM文件来表示崩溃日志很有帮助。我不会在这里讨论如何做到这一点 - 您可以搜索Google以查找更多详细信息;尝试将“symbolicate crash log DSYM”作为关键字。
一旦你这样做,而不是:
My App 0x0232032+433
它将显示如下内容:
My App [className callSomeMethod:argument]
更容易找到产生问题的代码行。
但是 - 请注意堆栈跟踪中的最后一行代码是Foundation中的[array objectAtIndex:]
。当您在接收器(例如数组)的边界之外传递索引时,此方法将抛出NSRangeException
。来自NSArray文档:
如果索引超出了结尾 数组(即,如果索引更大 大于或等于返回的值 count),引发NSRangeException。
所以,我会把钱花在你的车祸身上。
然后问题是 - 在你表示你的崩溃日志之后 - 你的代码的哪一行调用一个带有越界索引的数组?