6

iTunes Connect から少し奇妙なクラッシュ ログを受信して​​います。

以前は、アプリケーションが 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

更新 時間のかかるインポート コード (アプリケーションの更新時にのみ発生) を別のスレッドで実行しようとしています。プログレスバーが埋め込まれた 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
}
4

4 に答える 4

4

メインスレッドをブロックしている時間が長すぎます - 起動中または後で。メインスレッドでは軽量 GUI の作業のみを行います。2 番目のスレッドで作業を実行し、結果をメイン スレッドで待機する場合も、メイン スレッドはブロックされます。

楽器はあなたの友達です。

于 2010-11-30T20:42:24.223 に答える
2

すべてがメイン スレッドで実行されているようです... (そうですか?) この場合、UI が動かなくなる可能性があります。データベース情報を別のスレッドにロードし、データを取得するときに GUI を更新することを検討しましたか? 次に、時間のかかる関係でコードの各チャンクのパフォーマンスを測定し、読み込みにどれだけ時間がかかるかを正確に確認できます。

于 2010-11-30T20:42:32.930 に答える
1

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

インストゥルメントを使用していくつかの時間プロファイルを実行し、特に非効率的なものを修正して、できる限りバックグラウンド スレッド (つまり、UI を更新しないもの) を起動してみてください。ロードできます。バックグラウンド スレッドで大量のデータを処理し、データ オブジェクトが設定されると、それらをメイン スレッドに戻し、そこから更新セレクターを実行します。

于 2010-11-30T20:42:16.183 に答える
0

これについて直接の経験はありませんが、クラッシュ ログを読んだ後、アプリが起動後 20 秒よりわずかに長く 100% の CPU 時間を消費していることにデバイスが気付いたようです。この CPU 使用率がapplicationDidFinishLaunching:メソッド内にない場合でも、オペレーティング システムは騙されておらず、アプリを終了しているように見えます。

于 2010-11-30T20:41:44.180 に答える