更新:2016年4月14日:仍然在Fabric Crashlytics中看到这些崩溃,但仍然不确定我将如何修复。似乎会话崩溃率为0.2%。
据我所知,当Apple拍摄快照时,我的应用程序偶尔会崩溃(因为下面的代码段位于崩溃日志中)。但是,我不确定如何阻止它崩溃。
[UIApplication _updateSnapshotAndStateRestorationArchiveForBackgroundEvent:saveState:exitIfCouldNotRestoreState:]
我在SO上发现了一些其他帖子,但我没有使用任何类型的WebView(post),不使用任何广告,并在主线程中调用completionHandler。其他人似乎也遇到过类似的问题,但他们的post仍未得到答复。整个崩溃日志如下。这是Apple的内部错误,还是我可以解决的问题?
Thread : Crashed: com.apple.main-thread
0 libsystem_platform.dylib 0x1812962a0 _platform_memmove + 176
1 CoreFoundation 0x181544ed8 CFDataGetBytes + 172
2 CoreFoundation 0x181544ed8 CFDataGetBytes + 172
3 ImageIO 0x182cb599c CGImageReadGetBytesAtOffset + 624
4 ImageIO 0x182cb570c CGImageReadSessionGetBytes + 36
5 ImageIO 0x182d89acc iioReadCallback + 32
6 AppleJPEG 0x182c8bd04 aj_istream_move_to_position + 488
7 AppleJPEG 0x182c8c968 aj_istream_state_restore + 60
8 AppleJPEG 0x182c9b64c applejpeg_decode_set_ra_table + 804
9 ImageIO 0x182d8e1e0 copyImageBlockSetAppleJPEG + 6524
10 ImageIO 0x182cbf130 ImageProviderCopyImageBlockSetCallback + 852
11 QuartzCore 0x183d5ae0c CA::Render::create_image(CGImage*, CGColorSpace*, unsigned int) + 972
12 QuartzCore 0x183d59eec CA::Render::copy_image(CGImage*, CGColorSpace*, unsigned int, double) + 372
13 QuartzCore 0x183d32f00 -[CALayer(CALayerPrivate) _copyRenderLayer:layerFlags:commitFlags:] + 484
14 QuartzCore 0x183d32c54 CA::Context::commit_layer(CA::Layer*, unsigned int, unsigned int, void*) + 108
15 QuartzCore 0x183d2f9cc CA::Layer::commit_if_needed(CA::Transaction*, void (*)(CA::Layer*, unsigned int, unsigned int, void*), void*) + 392
16 QuartzCore 0x183d2f95c CA::Layer::commit_if_needed(CA::Transaction*, void (*)(CA::Layer*, unsigned int, unsigned int, void*), void*) + 280
17 QuartzCore 0x183d2f95c CA::Layer::commit_if_needed(CA::Transaction*, void (*)(CA::Layer*, unsigned int, unsigned int, void*), void*) + 280
18 QuartzCore 0x183d2f95c CA::Layer::commit_if_needed(CA::Transaction*, void (*)(CA::Layer*, unsigned int, unsigned int, void*), void*) + 280
19 QuartzCore 0x183d2f95c CA::Layer::commit_if_needed(CA::Transaction*, void (*)(CA::Layer*, unsigned int, unsigned int, void*), void*) + 280
20 QuartzCore 0x183d2f95c CA::Layer::commit_if_needed(CA::Transaction*, void (*)(CA::Layer*, unsigned int, unsigned int, void*), void*) + 280
21 QuartzCore 0x183d2f95c CA::Layer::commit_if_needed(CA::Transaction*, void (*)(CA::Layer*, unsigned int, unsigned int, void*), void*) + 280
22 QuartzCore 0x183d2f95c CA::Layer::commit_if_needed(CA::Transaction*, void (*)(CA::Layer*, unsigned int, unsigned int, void*), void*) + 280
23 QuartzCore 0x183d2f95c CA::Layer::commit_if_needed(CA::Transaction*, void (*)(CA::Layer*, unsigned int, unsigned int, void*), void*) + 280
24 QuartzCore 0x183d2f95c CA::Layer::commit_if_needed(CA::Transaction*, void (*)(CA::Layer*, unsigned int, unsigned int, void*), void*) + 280
25 QuartzCore 0x183d2f95c CA::Layer::commit_if_needed(CA::Transaction*, void (*)(CA::Layer*, unsigned int, unsigned int, void*), void*) + 280
26 QuartzCore 0x183d2f95c CA::Layer::commit_if_needed(CA::Transaction*, void (*)(CA::Layer*, unsigned int, unsigned int, void*), void*) + 280
27 QuartzCore 0x183d2f95c CA::Layer::commit_if_needed(CA::Transaction*, void (*)(CA::Layer*, unsigned int, unsigned int, void*), void*) + 280
28 QuartzCore 0x183d2f95c CA::Layer::commit_if_needed(CA::Transaction*, void (*)(CA::Layer*, unsigned int, unsigned int, void*), void*) + 280
29 QuartzCore 0x183d2d0cc CA::Context::commit_transaction(CA::Transaction*) + 1332
30 QuartzCore 0x183d2c9dc CA::Transaction::commit() + 512
31 UIKit 0x1865ab768 _UIWindowUpdateVisibleContextOrder + 236
32 UIKit 0x1865ab5b4 +[UIWindow _prepareWindowsPassingTestForAppResume:] + 32
33 UIKit 0x1865e1468 __114-[UIApplication _updateSnapshotAndStateRestorationArchiveForBackgroundEvent:saveState:exitIfCouldNotRestoreState:]_block_invoke_3 + 72
34 libdispatch.dylib 0x181089630 _dispatch_call_block_and_release + 24
35 libdispatch.dylib 0x1810895f0 _dispatch_client_callout + 16
36 libdispatch.dylib 0x18108ecf8 _dispatch_main_queue_callback_4CF + 1844
37 CoreFoundation 0x1815ecbb0 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 12
38 CoreFoundation 0x1815eaa18 __CFRunLoopRun + 1628
39 CoreFoundation 0x181519680 CFRunLoopRunSpecific + 384
40 GraphicsServices 0x182a28088 GSEventRunModal + 180
41 UIKit 0x186390d90 UIApplicationMain + 204
42 MyApp 0x100095888 main (main.m:16)
43 libdispatch.dylib 0x1810ba8b8 (Missing)
答案 0 :(得分:1)
在某个地方触发UIKit操作后台线程是一个不错的选择。确切地找到了什么...这是一个技巧。运气不错,this gist may be of help。
这是一个在主要线程以外的线程上追踪UIKit访问的守卫。此代码段取自商业iOS PDF框架http://pspdfkit.com,但在MIT下重新许可。之所以有效,是因为很多调用都在内部调用setNeedsDisplay或setNeedsLayout。不会抓住所有东西,但它非常轻巧,通常可以胜任。
如果您的应用中有任何广告展示SDK,那将是一个非常好的首要怀疑。他们有一种令人沮丧的习惯,就是将UI操作正确地限制在主线程中是非常可怕的。