сбой приложения iPhone при запуске - PullRequest
5 голосов
/ 30 ноября 2010

Мы получаем журнал сбоев от iTunes connect, что немного странно.

У нас раньше были проблемы с нашим приложением, поэтому потребовалось много времени, чтобы вернуться из ApplicationDidFinishLaunching. Это было вызвано слишком большой работой внутри applicationDidFinishLaunching, и мы превысили 20-секундный тайм-аут на более медленных устройствах.

Чтобы исправить это, мы переместили весь наш установочный код из ApplicationDidFinishLaunching и переместили его в специальный secondLoadingController. Кроме того, мы переместили установочный код внутри этого контроллера в отдельный поток.

Однако мы все еще видим журналы сбоев, в которых говорится, что наше приложение не запустилось вовремя, хотя в журнале сбоев отображается вызов [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 со встроенным индикатором выполнения, чтобы пользователь знал, что что-то еще происходит. Во время нашего процесса тестирования это работает отлично. Ниже приведен код потока, который не работает. Кажется, в журнале сбоев указывается, что вся работа выполняется в главном потоке.

    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 голосов
/ 30 ноября 2010

Вы все еще блокируете основной поток слишком долго - будь то во время запуска или позже. Только легкий графический интерфейс работает на основном потоке. Основной поток также блокируется, если вы выполняете работу во втором потоке, но ждете в основном потоке результатов.

Инструменты - твой друг здесь.

2 голосов
/ 30 ноября 2010

кажется, что все работает в главном потоке ... (я прав?) Если это так, он может застрять в вашем интерфейсе. Рассматривали ли вы загрузить информацию о вашей базе данных в другой поток и обновлять графический интерфейс по мере получения данных? во-вторых, вы можете измерить производительность каждого куска кода в зависимости от времени и посмотреть, что именно занимает столько времени для загрузки.

1 голос
/ 30 ноября 2010

его установка отключена от сторожевого таймера.его блокировка основного потока более 20 секунд.как уже было сказано, вам нужно ленивым грузом.загружайте только то, что будет видно на первом экране.

Запустите на нем некоторые временные профили, используя инструменты, попробуйте исправить все, что является особенно неэффективным, и постарайтесь выкинуть столько, сколько сможете, нафоновый поток. (т.е. все, что не будет обновлять пользовательский интерфейс), вы можете загрузить много данных в фоновом потоке, и как только объекты данных будут настроены, передать их обратно в основной поток и запустить селектор обновления изтам.

0 голосов
/ 30 ноября 2010

Хотя у меня нет прямого опыта с этим, после прочтения вашего журнала сбоев, кажется, что устройство заметило, что ваше приложение занимает 100% процессорного времени чуть дольше 20 секунд после запуска. Может показаться, что даже если это использование ЦП не относится к методу applicationDidFinishLaunching:, операционная система не одурачена и завершает работу вашего приложения.

...