2010-11-30 39 views
5

iTunesのクラッシュログを受信して​​います。これはちょっと変です。iPhoneアプリケーションが起動時にクラッシュする

我々はpreivously我々のアプリがApplicationDidFinishLaunchingから返すように長いに取るとの問題を抱えてました。これはapplicationDidFinishLaunchingの内部で多すぎる作業をしたために発生し、遅いデバイスで20秒のタイムアウトを超えました。我々はApplicationDidFinishLaunchingのうち、私たちのセットアップコードのすべてを移動し、特別なsecondaryLoadingControllerにそれを移動し、この問題を解決するには

。その上に、そのコントローラー内のセットアップコードを別のスレッドに移動しました。

しかし、クラッシュログには、[UIApplication _reportAppLaunchFinished]へのコールが表示されても、アプリが間に合わずに起動できなかったと言うクラッシュログが表示されています。私にとっては、これはアプリの起動が完了したことを示しており、セットアップコードを実行したい限り、自由に実行する必要があります。以下はクラッシュログです。

ご協力いただきありがとうございます。

Incident Identifier: 429360D5-6B02-49BE-9A0F-164DC521BE36 
Hardware Model:  iPod2,1 
Process:   XYZ [357] 
Path:   /var/mobile/Applications/D5038F26-CC5B-48E5-824E-090163B5C0C4/XYZ.app/XYZ 
Identifier:  XYZ 
Version:   ??? (???) 
Code Type:  ARM (Native) 
Parent Process: launchd [1] 



Date/Time:  2010-09-28 13:35:25.138 -0700 
OS Version:  iPhone OS 4.0 (8A293) 
Report Version: 104 



Exception Type: 00000020 
Exception Codes: 0x8badf00d 
Highlighted Thread: 0 



Application Specific Information: 
com.xyz.xyz failed to launch in time 
elapsed total CPU time (seconds): 20.180 (user 15.910, system 4.270), 100% CPU 
elapsed application CPU time (seconds): 10.960, 54% CPU 



Thread 0: 
0 libobjc.A.dylib     0x3523a50c objc_msgSend + 44 
1 CoreFoundation     0x363bf568 -[__NSArrayM addObject:] 
2 XYZ      0x0000a152 -[Database fetchDrinks:] + 290 
3 XYZ      0x0000677c -[Database getAllDrinks] + 136 
4 XYZ      0x0003a164 -[SecondaryLoadingViewController viewDidLoad] + 208 
5 UIKit        0x323e582c -[UIViewController view] 
6 UIKit        0x323f9628 -[UIViewController viewControllerForRotation] 
7 UIKit        0x323f9574 -[UIViewController _visibleView] 
8 UIKit        0x323f94fc -[UIViewController rotatingContentViewForWindow:] 
9 UIKit        0x3249a514 -[UIClientRotationContext initWithClient:toOrientation:duration:andWindow:] 
10 UIKit        0x32499314 -[UIWindow _setRotatableClient:toOrientation:duration:force:] 
11 UIKit        0x32497d78 -[UIWindowController transition:fromViewController:toViewController:target:didEndSelector:] 
12 UIKit        0x32497534 -[UIViewController presentModalViewController:withTransition:] 
13 UIKit        0x324977fc -[UIViewController _tryRecursivelyPresentModalViewController:withTransition:] 
14 UIKit        0x324977c0 -[UIViewController _tryRecursivelyPresentModalViewController:withTransition:] 
15 UIKit        0x32496e00 -[UIViewController presentModalViewController:withTransition:] 
16 UIKit        0x3249699c -[UIViewController presentModalViewController:animated:] 
17 XYZ      0x000044a2 -[HomeViewController viewDidLoad] + 82 
18 UIKit        0x323e582c -[UIViewController view] 
19 UIKit        0x323fd68c -[UIViewController contentScrollView] 
20 UIKit        0x323fd4ac -[UINavigationController _computeAndApplyScrollContentInsetDeltaForViewController:] 
21 UIKit        0x323fd358 -[UINavigationController _layoutViewController:] 
22 UIKit        0x323fccb8 -[UINavigationController _startTransition:fromViewController:toViewController:] 
23 UIKit        0x323fca1c -[UINavigationController _startDeferredTransitionIfNeeded] 
24 UIKit        0x323fc90c -[UINavigationController viewWillLayoutSubviews] 
25 UIKit        0x323fc43c -[UILayoutContainerView layoutSubviews] 
26 UIKit        0x32370ab0 -[UIView(CALayerDelegate) _layoutSublayersOfLayer:] 
27 CoreFoundation     0x363c85ba -[NSObject(NSObject) performSelector:withObject:] 
28 QuartzCore      0x30c8c61c 0x30c82000 + 42524 
29 QuartzCore      0x30c8c2a4 0x30c82000 + 41636 
30 QuartzCore      0x30c8bbb0 0x30c82000 + 39856 
31 QuartzCore      0x30c8b7d8 0x30c82000 + 38872 
32 QuartzCore      0x30c8b684 0x30c82000 + 38532 
33 UIKit        0x323d99d4 -[UIApplication _reportAppLaunchFinished] 
34 UIKit        0x3251d77c -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] 
35 UIKit        0x323d87b8 -[UIApplication handleEvent:withNewEvent:] 
36 UIKit        0x323d7eb4 -[UIApplication sendEvent:] 
37 UIKit        0x323d77e8 _UIApplicationHandleEvent 
38 GraphicsServices     0x33c4dedc PurpleEventCallback 
39 CoreFoundation     0x364142ac __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ 
40 CoreFoundation     0x364161d6 __CFRunLoopDoSource1 
41 CoreFoundation     0x3641718e __CFRunLoopRun 
42 CoreFoundation     0x363be0bc CFRunLoopRunSpecific 
43 CoreFoundation     0x363bdfca CFRunLoopRunInMode 
44 UIKit        0x32363b18 -[UIApplication _run] 
45 UIKit        0x32361fb8 UIApplicationMain 
46 XYZ      0x00002b20 main + 36 
47 XYZ      0x00002af0 start + 32 

UPDATE 私は別のスレッドで(のみアプリケーションの更新時に起こる)輸入コードを消費する時間を実行しようとしています。私は、AlertViewを使ってGUIに最新のプログレスバーを表示しているので、ユーザーは何かが起こっていることを知っています。私たちのテストプロセスの間、これは正常に動作します。以下は動作していないと思われるスレッドコードです。クラッシュログは、すべての作業がメインスレッドで行われていることを示しているようです。

if ([database appDidUpdate] == YES) { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    dbImportThread = [[NSThread alloc] initWithTarget:self selector:@selector(import) object:nil]; 
    [dbImportThread start]; 
    [pool release]; 

- (void)import { 
//do importing work and update the gui with the progress 
} 
+1

このすべての情報は、アプリがすぐに必要とするものですか?モバイルデバイスでは、怠惰なローディングがあなたの友人になるはずです。 @Jesse Naugherの+1 –

+0

+1モバイルアプリのデザインで、アプリの起動中にユーザーが20秒以上立っていなければならない場合、クラッシュよりも大きな問題が発生します。それはちょうど悪いデザインです。すぐに表示するために必要なデータを読み込むだけで、すべての問題を解決し、アプリ全体を改善することができます。 – TechZen

+0

このロードは実際には更新でのみ発生します。ユーザーが入力したデータはたくさんあり、ユーザーのデフォルトに保存します。更新プログラムに新しいデータベースが付属している場合は、そのユーザーデータを新しいdbにインポートする必要があります。したがって、このケースはあまり頻繁に起こることはありませんが、アップデートが遅いデバイスの人々は常に問題にぶつかります。 – jmurphy

答えて

4

あなたはまだあまりにも長い間、メインスレッドをブロックしている - それは、起動時に以降です。軽量のGUIはメインスレッドでのみ動作します。メインスレッドは、2番目のスレッドで作業を実行し、メインスレッドで結果を待つ場合にもブロックされます。

楽器はここにあなたの友人です。

+1

+1 OSは、発生するタイミングに関係なく、20秒以上のUIフリーズのようなものを探しています。 – TechZen

+0

別のスレッドでコードを実行しても問題ありません。私はちょうどGUIをブロックする可能性のあるいくつかの追加コードを発見しました。うまくいけば、私は別のスレッドにそれを置くことができ、大丈夫です。 – jmurphy

+0

はい、しかし、CPU時間はあなたの問題ではありません - 壁の時間はです。それをブロックしないでください。あなたは大丈夫です。 performSelectorOnMainThreadを使用してメインスレッドの(短い)GUI更新をスケジュールします。 – Eiko

0

私はこれと直接の経験を持っていませんが、あなたのクラッシュログを読んだ後、デバイスアプリが起動した後、わずか20秒以上、100%のCPU時間を割いて気づいたことが表示されます。このCPU使用率がapplicationDidFinishLaunching:メソッド内にない場合でも、オペレーティングシステムはだまされずにアプリケーションが終了するように見えます。

1

ウォッチドッグタイマをオフに設定します。 メインスレッドを20秒以上ブロックしています。 これまで述べてきたように、遅延ロードが必要です。最初の画面に表示されるものだけを読み込みます。

楽器を使用して、いくつかの時間プロファイルを実行すると、特に効率の悪いものを修正して、バックグラウンドスレッドに乗り遅れるほどのものを試してみてください(IEの更新予定はありませんUI) バックグラウンドスレッドで大量のデータを読み込むことができます。データオブジェクトが設定されると、それらをメインスレッドに戻してそこから更新セレクタを実行します。

2

は(私は右だ?)...すべてがメインスレッドで実行されているようだ、これはそれがあなたのUIを立ち往生する場合であれば。別のスレッドでデータベース情報を読み込み、データを取得したときにGUIを更新することを検討しましたか?第2に、時間軸の関係でコードの各チャンクのパフォーマンスを測定し、ロードに時間がかかるのを正確に見ることができます。

関連する問題