2010-11-30 259 views
5

我們從iTunes連接收到崩潰日誌,這有點奇怪。發佈iPhone應用程序崩潰

我們很早就遇到了問題,我們的應用程序花了很長時間才從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

是你所加載的所有這些信息是否需要立即通過應用程序?延遲加載應該是你在移動設備上的朋友。 – 2010-11-30 20:38:24

+0

@Jesse Naugher +1。如果您的移動應用設計要求您的用戶在應用啓動時保持20多秒的時間,您的問題就會比崩潰更嚴重。這只是糟糕的設計。您只需加載需要立即顯示的數據,即可解決您的所有問題並全面改善應用程序。 – TechZen 2010-11-30 20:50:03

回答

4

您仍然阻止主線程時間過長 - 無論是在啓動期間還是之後。只在主線程上做輕量級GUI工作。如果您在第二個線程上執行工作,但在主線程中等待結果,主線程也會被阻塞。

樂器是你的朋友在這裏。

0

雖然我沒有與這種直接的經驗,閱讀你的崩潰日誌之後,看來該設備註意到您的應用程序啓動後以100%的CPU時間略超過20秒。看起來即使這種CPU使用率不在applicationDidFinishLaunching:方法中,操作系統也不會被愚弄並終止您的應用程序。

1

它設置了一個看門狗定時器。它阻塞主線程20秒以上。如前所述,你需要延遲加載。只加載在第一個屏幕上可見的內容。

在其上運行一段時間配置文件中使用的儀器, 嘗試修復任何特別低效,並嘗試踢儘可能多的可以到後臺線程脫身。(IE東西都不會被更新UI) 您可以在後臺線程上加載大量數據,並且一旦數據對象已經設置,將它們傳遞迴主線程,並從那裏運行更新選擇器。

2

似乎一切都在主線程上執行......(我是對嗎?)如果是這種情況,它可能會卡住你的用戶界面。您是否考慮在另一個線程上加載數據庫信息並在獲取數據時更新GUI?其次,您可以測量每個代碼塊在時間關係中的性能,並查看究竟需要多少時間才能加載。