无法追查崩溃
在Foundation的-[NSData(NSData) getBytes:length:]
方法中,我EXC_BAD_ACCESS
了一个奇怪的EXC_BAD_ACCESS
崩溃。 它经常发生,但是我无法从堆栈跟踪中得到任何有意义的信息。 没有调用getBytes:length:
在我的代码中,除了开放源代码库(一个在SDWebImage
,一个在SocketRocket
),但看起来不像是导致崩溃。
唯一的提示是崩溃发生在com.apple.CFNetwork.addPersistCacheToStorageDaemon
线程内,但是我不知道它是什么。 有人可以帮忙吗?
Crashlytics的Stacktrace:
Thread : Crashed: com.apple.CFNetwork.addPersistCacheToStorageDaemon 0 libsystem_platform.dylib 0x3044a208 _platform_memmove$VARIANT$CortexA9 + 160 1 Foundation 0x22df9167 -[NSData(NSData) getBytes:length:] + 118 2 Foundation 0x22df9167 -[NSData(NSData) getBytes:length:] + 118 3 Foundation 0x22e21a1b -[NSData(NSData) replacementObjectForCoder:] + 134 4 Foundation 0x22dc2aff -[NSXPCEncoder _replaceObject:] + 90 5 Foundation 0x22e240dd -[NSXPCEncoder _encodeArrayOfObjects:forKey:] + 192 6 Foundation 0x22e212ff -[NSDictionary(NSDictionary) encodeWithCoder:] + 922 7 Foundation 0x22dc32c9 -[NSXPCEncoder _encodeObject:] + 604 8 Foundation 0x22dc379d encodeInvocationArguments + 460 9 Foundation 0x22dc3455 -[NSXPCEncoder encodeInvocation:] + 360 10 Foundation 0x22dc32c9 -[NSXPCEncoder _encodeObject:] + 604 11 Foundation 0x22dc2335 -[NSXPCConnection _sendInvocation:proxyNumber:remoteInterface:withErrorHandler:timeout:userInfo:] + 1860 12 Foundation 0x22dd2823 -[NSXPCConnection _sendInvocation:proxyNumber:remoteInterface:withErrorHandler:] + 58 13 Foundation 0x22dd27db -[_NSXPCDistantObjectWithError forwardInvocation:] + 114 14 CoreFoundation 0x2217e831 ___forwarding___ + 352 15 CoreFoundation 0x220afb88 _CF_forwarding_prep_0 + 24 16 CFNetwork 0x21c52ac9 -[NSURLStorage_CacheClient addCachedResponseWithDictionary:key:] + 120 17 CFNetwork 0x21c21e29 ___ZN12__CFURLCache23CreateAndStoreCacheNodeEP16__CFURLCacheNodePK20_CFCachedURLResponsePK10__CFStringPK13_CFURLRequestPKvbRb_block_invoke + 1576 18 libdispatch.dylib 0x302cf423 _dispatch_call_block_and_release + 10 19 libdispatch.dylib 0x302d95d9 _dispatch_queue_drain$VARIANT$mp + 948 20 libdispatch.dylib 0x302d90a9 _dispatch_queue_invoke$VARIANT$mp + 84 21 libdispatch.dylib 0x302db0d3 _dispatch_root_queue_drain + 330 22 libdispatch.dylib 0x302dc1fb _dispatch_worker_thread3 + 106 23 libsystem_pthread.dylib 0x3044ce25 _pthread_wqthread + 668
另一个(不经常发生):
Thread : Crashed: com.apple.CFNetwork.addPersistCacheToStorageDaemon 0 libsystem_platform.dylib 0x000000019344d300 _platform_memmove + 176 1 Foundation 0x0000000182dfce18 -[NSData(NSData) getBytes:length:] + 172 2 Foundation 0x0000000182dfce18 -[NSData(NSData) getBytes:length:] + 172 3 Foundation 0x0000000182e2ae3c -[NSData(NSData) replacementObjectForCoder:] + 160 4 Foundation 0x0000000182dbd320 -[NSXPCEncoder _replaceObject:] + 120 5 Foundation 0x0000000182e2dac8 -[NSXPCEncoder _encodeArrayOfObjects:forKey:] + 256 6 Foundation 0x0000000182e2a544 -[NSDictionary(NSDictionary) encodeWithCoder:] + 1016 7 Foundation 0x0000000182dbdd10 -[NSXPCEncoder _encodeObject:] + 716 8 Foundation 0x0000000182dbe2e8 encodeInvocationArguments + 508 9 Foundation 0x0000000182dbdee4 -[NSXPCEncoder encodeInvocation:] + 412 10 Foundation 0x0000000182dbdd10 -[NSXPCEncoder _encodeObject:] + 716 11 Foundation 0x0000000182dbcb0c -[NSXPCConnection _sendInvocation:proxyNumber:remoteInterface:withErrorHandler:timeout:userInfo:] + 2196 12 CoreFoundation 0x0000000181fde230 ___forwarding___ + 440 13 CoreFoundation 0x0000000181ee2b6c _CF_forwarding_prep_0 + 92 14 CFNetwork 0x000000018199c908 ___ZN12__CFURLCache23CreateAndStoreCacheNodeEP16__CFURLCacheNodePK20_CFCachedURLResponsePK10__CFStringPK13_CFURLRequestPKvbRb_block_invoke + 1976 15 libdispatch.dylib 0x00000001932793ac _dispatch_call_block_and_release + 24 16 libdispatch.dylib 0x000000019327936c _dispatch_client_callout + 16 17 libdispatch.dylib 0x00000001932834c0 _dispatch_queue_drain + 1216 18 libdispatch.dylib 0x000000019327c474 _dispatch_queue_invoke + 132 19 libdispatch.dylib 0x0000000193285224 _dispatch_root_queue_drain + 664 20 libdispatch.dylib 0x000000019328675c _dispatch_worker_thread3 + 108 21 libsystem_pthread.dylib 0x00000001934552e4 _pthread_wqthread + 816
随着iOS 8的推出,还有一些意想不到的错误发生,我们也必须牢记这一点。
Mile Mobile这样的应用程序也像您一样遭遇这个问题,尽pipe截至目前还没有广泛传播。
这里是MIT & MilePoint的错误链接。
com.apple.CFNetwork.addPersistCacheToStorageDaemon
CFNetwork是较低级别的C API,并且被NSURLConnection等更高级的类所包装。
所以在networking运行中发生崩溃
EXC_BAD_ACCESS
这意味着消息被发送到一个没有类的实例来执行的内存地址。 因此导致“访问不良”
什么时候会发生?
- 一个对象没有被初始化
- 一个对象已经被释放
- 其他一些不太可能发生的事情
我们如何解决这个问题?
- 您可以通过在xcode中启用NSZombie来捕获一些错误(编号2)
启用NSZombie:
启用此function后,每个释放对象的位置都会保留一个虚拟对象(僵尸),从而允许debugging已释放的对象。 非常容易启用:
- 双击XCode中“可执行文件”中的可执行文件
- 打开“参数”选项卡在“要在环境中设置的variables”(这是在底部的列表,小心哪一个你编辑)
- 点击“+”button,为variables的名称input“NSZombieEnabled”和值“是”
现在,不要想知道发生了什么事情以及哪个确切的对象产生了问题,您将会看到究竟哪个类是麻烦制造者,而且您会很快地进行debugging。
注意:当您将应用程序提交到App Store时,请勿启用僵尸程序。 另外,如果您不需要它们,禁用它们也是一种很好的做法。
- 如果您正在使用第三方库,请将其更新至最新版本
注意:
我的build议是从来没有使用第三方框架,除非它是不可避免的,因为图书馆本身有时会出现开发人员控制的错误,有时库会更新到现在的SDK迟到。你可以在这里find更多关于它
希望这可以帮助
我的猜测是你有
- 一些
__unsafe_unretained
(这是不可避免的设置path[NSInvocation setArgument:atIndex:]
) - 或者像这样的问题
- 或者( 更可能 )在
performBlockAndWait
期间死锁 (因为我已经看到堆栈中的连接/超时)
几个相关的build议:
1) NSManagedObject
, NSManagedObjectContext
和NSPersistentStoreCoordinator
(给定addPersistCacheToStorageDaemon
崩溃)不是线程安全的:
- 考虑一下,如果你使用
performBlockAndWait
发送消息到你的NSManagedObjectContext
(更多这里和这里 )或嵌套的MOC 。
2) CFNetwork
是NSURLConnection
封装的一个较低级别的类:
- 所以不使用
NSURL
? 避免addObserver:self forKeyPath
(KVO)到NSURL会话的属性?
这个问题实际上可以从SDWebImage引用这个网站:
现在,如果使用AFNetworking使用AFNetworking类别直接从URL设置图像,则可能需要使用替代方法,以便干预和调整图像大小。 下面的代码将做到这一点。
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:imageURL]; [request addValue:@"image/*" forHTTPHeaderField:@"Accept"]; [imageView setImageWithURLRequest:request placeholderImage:nil success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) { // resize image // set image on imageView } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) { // handle error }];
我也会检查这个页面的相关崩溃:
https://github.com/rs/SDWebImage/issues?q=is%3Aopen+is%3Aissue+label%3Acrash
检查您是否使用最新版本的SDWebImage,否则您可能需要检查旧的问题。
- GKNotificationBanner在iOS 4.3.3上
- xcode gm ios 8 gm swift今天扩展崩溃在模拟器和设备:库未加载:@ rpath / libswiftCore.dylib
- iOS应用程序在Xcode中设置断点时崩溃
- iPad 3设备与renderInContext崩溃
- iOS 7只有应用程序在启动时崩溃
- iOS应用程序崩溃的苹果审查小组,但不是在我的设备上
- 重新排列部分之间的项目时,UICollectionView崩溃
- 如何跟踪iOS5的崩溃?
- MyApp“具有超出允许时间的活动断言”崩溃 – CoreLocationRegistration和CoreLocationBackgroundClient