0

他のテスターではなく、テスターの 1 人だけがクラッシュするアプリがあります。しかし、彼女にとっては一貫してクラッシュします。とても奇妙です。

詳細:
彼女は iPhone 4 と iPhone 3G を持っています 両方の
電話のすべての OS で
アプリがクラッシュします どのように作成されたかに関係なく、すべての連絡先でアプリがクラッシュし
ますs)
クラッシュが発生したのは彼女だけであり、両方の電話とすべての OS で一貫しています。彼女は
アプリとプロビジョニング プロファイルをアンインストールして再インストールしました
。彼女は iPhone を Windows マシン バージョンの iTunes と同期しています。

ABPeoplePicker を使用すると、クラッシュが発生します。
彼女の視点では、電話番号を選択した瞬間にアプリがクラッシュするように見えます。もちろん、彼女はその時点で私たちのアプリにはいません。彼女は、Apple が提供する ABPeoplePicker ナビゲーション ビューにいます。再記号化されたクラッシュ ログから、アプリに戻ろうとしているときに実際にクラッシュしているように見えます。言い換えれば、クラッシュ ログでアプリが実際にクラッシュの原因であるという言及を見つけることができません (以下を参照)。選択した電話番号のインデックスを取得できず、アプリに戻ろうとすると失敗するようですが、それはせいぜい推測です. 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];
 }
4

1 に答える 1

2

symbolicatecrash何よりも、ツールと、ツールをコンパイルしたときに生成された DSYM ファイルを使用して、クラッシュ ログをシンボル化すると役立ちます。その方法についてはここでは説明しません。詳細については、Google を検索してください。キーワードとして「symbolicate crash log DSYM」を試してください。

それをしたら、代わりに:

My App      0x0232032+433

次のように表示されます。

My App      [className callSomeMethod:argument]

問題を引き起こしているコード行を見つけるのがはるかに簡単になります。

ただし、スタック トレースで、コードの最後の行が[array objectAtIndex:]Foundation にあることに注意してください。NSRangeExceptionこのメソッドは、レシーバーの境界外 (配列など) のインデックスを渡すと、をスローします。NSArray ドキュメントから:

index が配列の末尾を超えている場合 (つまり、index が count によって返される値以上の場合)、NSRangeException が発生します。

だから、私はそれがあなたのクラッシュであることに私のお金を置きます.

問題は、クラッシュ ログをシンボル化した後、コードのどの行が範囲外のインデックスを持つ配列を呼び出しているかということです。

于 2010-12-07T20:15:08.600 に答える