首次启动后应用程序崩溃
Posted
技术标签:
【中文标题】首次启动后应用程序崩溃【英文标题】:Application crashes after first launch 【发布时间】:2014-03-17 11:58:59 【问题描述】:我已经在应用商店下载了这个应用。我发布了一个带有一些更改的更新版本。这个应用程序使用 CoreData 进行数据持久化。我在应用商店发布之前测试了它的新版本,它按要求工作。但是在应用商店提交并从那里更新后,应用程序在每次启动后都会崩溃。我有那个崩溃报告,但这对我来说没有任何意义。我没有更改 CoreData 中的任何内容。 启动后,此应用显示 UITableView,并且此 tableView 正在从 CoreData 获取数据。
这是崩溃报告。
Incident Identifier: 7A9713FF-40CB-45E0-961F-F4D1B003F2B5
CrashReporter Key: 891c38a57639ab8e2bcc3012687292ce9aa818f5
Hardware Model: iPhone6,2
Process: APPName [7461]
Path: /var/mobile/Applications/A9028B70-0878-40FA-944B-584B15E49B69/APPName.app/APPName
Identifier: co.identifier.app
Version: 2.5 (2.5)
Code Type: ARM (Native)
Parent Process: launchd [1]
Date/Time: 2014-03-13 09:39:17.309 +0000
OS Version: ios 7.0.6 (11B651)
Report Version: 104
Exception Type: 00000020
Exception Codes: 0x000000008badf00d
Highlighted Thread: 0
Application Specific Information:
co.identifier.app failed to launch in time
Elapsed total CPU time (seconds): 1.660 (user 1.660, system 0.000), 4% CPU
Elapsed application CPU time (seconds): 0.304, 1% CPU
Thread 0:
0 libsystem_kernel.dylib 0x3a161fa8 __psynch_mutexwait + 24
1 libsystem_pthread.dylib 0x3a1c6f4d _pthread_mutex_lock + 305
2 CoreData 0x2f595a91 -[_PFLock lock] + 21
3 CoreData 0x2f5a6b35 -[NSPersistentStoreCoordinator executeRequest:withContext:error:] + 777
4 CoreData 0x2f5a5777 -[NSManagedObjectContext executeFetchRequest:error:] + 611
5 APPName 0x000ecc11 +[DataManager dataEntryEntity:] (DataManager.m:385)
6 APPName 0x000ebca9 +[DataManager dataForDateKey:] (DataManager.m:126)
7 APPName 0x000cff9d -[CalendarCell setDateKey:] (CalendarCell.m:820)
8 APPName 0x000bd969 -[CalendarViewController tableView:cellForRowAtIndexPath:] (CalendarViewController.m:832)
9 UIKit 0x32108311 -[UITableView _createPreparedCellForGlobalRow:withIndexPath:] + 405
10 UIKit 0x320b06c9 -[UITableView _updateVisibleCellsNow:] + 1797
11 UIKit 0x320afeed -[UITableView layoutSubviews] + 181
12 UIKit 0x31fd634f -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 343
13 QuartzCore 0x31c5c93f -[CALayer layoutSublayers] + 139
14 QuartzCore 0x31c58163 CA::Layer::layout_if_needed(CA::Transaction*) + 347
15 QuartzCore 0x31c57ff5 CA::Layer::layout_and_display_if_needed(CA::Transaction*) + 13
16 QuartzCore 0x31c57a09 CA::Context::commit_transaction(CA::Transaction*) + 225
17 QuartzCore 0x31c5781b CA::Transaction::commit() + 311
18 UIKit 0x32055a37 -[UIApplication _reportAppLaunchFinished] + 39
19 UIKit 0x32040edb -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 1643
20 UIKit 0x31fdba03 -[UIApplication handleEvent:withNewEvent:] + 3139
21 UIKit 0x31fdacf9 -[UIApplication sendEvent:] + 69
22 UIKit 0x3204031d _UIApplicationHandleEvent + 661
23 GraphicsServices 0x344ba76b _PurpleEventCallback + 607
24 GraphicsServices 0x344ba353 PurpleEventCallback + 31
25 CoreFoundation 0x2f81c775 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 33
26 CoreFoundation 0x2f81c70f __CFRunLoopDoSource1 + 343
27 CoreFoundation 0x2f81aedb __CFRunLoopRun + 1403
28 CoreFoundation 0x2f78546d CFRunLoopRunSpecific + 521
29 CoreFoundation 0x2f78524f CFRunLoopRunInMode + 103
30 UIKit 0x3203f5bf -[UIApplication _run] + 759
31 UIKit 0x3203a841 UIApplicationMain + 1133
32 APPName 0x000b6ba7 main (main.m:11)
33 libdyld.dylib 0x3a0abab5 start + 1
在每台更新应用程序的设备上都会产生这种崩溃,并且不会在模拟器测试或通过 testFlight 分发的测试构建中重现。
【问题讨论】:
您是否更改了数据模型?如果是这样,这将是你的原因。 它在抱怨您在启动完成之前花费的时间。由于主线程正在等待锁,我的第一个问题是:是否有其他线程持有该锁并阻止您? (另一种可能性是,当您填充表格单元格并需要将其中一些移到后台时,您只是在做太多工作。) 【参考方案1】:正如菲利普在评论中所说,这次崩溃的原因是看门狗。
如果你的应用长时间卡在-applicationDidFinishLauchingWithOptions:
方法中,系统会kill它。
原因可能是您在此方法内的主线程上执行了一项耗时的任务,这可能是迁移、复制或删除大量文件。
您从未在测试中体验过,因为可能您使用了少量数据,或者因为在调试模式下看门狗未激活(不确定)。
不幸的是,我认为您应该尽快发布另一个版本来解决这个问题,解决方案可能是在后台线程上启动那些长时间运行的任务。
为了防止出现这些问题,请务必在发布之前尝试使用临时分发更新旧应用。
【讨论】:
我在将其发布到应用商店之前对其进行了测试。但这对我来说完全出乎意料。您如何知道可以将应用程序分发给任何用户的任何方法。?现在我知道那些你先添加 UDID 然后只有那些设备才能安装应用程序的方法。 AD-HOC 分发,需要 UDID,但它是发布版本而不是调试版本。我通常按照这些步骤developer.apple.com/library/mac/Documentation/IDEs/Conceptual/… 你也可以在 google 上找到更简单的教程搜索 我遵循这些指导方针。我想摆脱添加 UDID。谢谢@Andrea【参考方案2】:来自http://www.raywenderlich.com/23704/demystifying-ios-application-crash-logs
以下是一些较常见的异常代码: 0x8badf00d:读作“吃了不好的食物”! (如果你眯着眼睛,将数字替换为字母字符。:p)此代码表示应用程序已被 iOS 终止,因为发生了看门狗超时。基本上,应用程序启动、终止或响应系统事件的时间过长。
崩溃是由于长时间等待,导致它出现在日志中列出的 321 个任务项中的 1 个中。
我真的很好奇您在日志中的发送事件/处理事件项。在启动 rootViewController 之前,您是否有机会等待某些事情? ...它可能是核心数据,但如果有什么非常错误的,我有点预计会发生另一个错误,而不是等待。
【讨论】:
你是对的,有东西阻塞了主线程。但我不确定它是否会阻止崩溃问题。会测试它。谢谢你的线索。以上是关于首次启动后应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章
首次启动应用程序时,我在 didReceiveRemoteNotification 崩溃 [重复]