映射文件解除映射时崩溃

9
我正在处理一个应用程序,它出现了一个非常奇怪的崩溃问题,我无法重现,唯一的信息来源是Crashlytics。这只发生在ios7上,搜索mmapFileDeallocate只返回一个网站,其中有人也遇到了同样的崩溃问题,但他们的问题通过操作系统更新得以解决。
以下是堆栈信息:
Thread : Crashed: tcpConnWorkQueue
0  libobjc.A.dylib                0x3aa00b36 objc_msgSend + 21
1  CFNetwork                      0x2fece4c3 __CFURLCache::removeMMappedDataFromSet(void*) + 34
2  CFNetwork                      0x2fecfa45 mmapFileDeallocate(void*, void*) + 24
3  CoreFoundation                 0x3024ef5f __CFDataDeallocate + 30
4  CoreFoundation                 0x301c75f7 CFRelease + 462
5  CoreFoundation                 0x3023fed5 __CFArrayReleaseValues + 292
6  CoreFoundation                 0x301c75f7 CFRelease + 462
7  CFNetwork                      0x2fe5f1d5 __CFCachedURLResponse::~__CFCachedURLResponse() + 40
8  CFNetwork                      0x2fe5f19f __CFCachedURLResponse::~__CFCachedURLResponse() + 10
9  CoreFoundation                 0x301c75f7 CFRelease + 462
10 CFNetwork                      0x2feaeda1 HTTPProtocol::~HTTPProtocol() + 732
11 CoreFoundation                 0x301c75f7 CFRelease + 462
12 CoreFoundation                 0x302b10f0 __CFBasicHashDrain + 332
13 CoreFoundation                 0x301c75f7 CFRelease + 462
14 CFNetwork                      0x2fe9226b SocketStream::~SocketStream() + 406
15 CFNetwork                      0x2fe920c5 SocketStream::~SocketStream() + 20
16 CoreFoundation                 0x301c75f7 CFRelease + 462
17 libdispatch.dylib              0x3aee8d1b _dispatch_call_block_and_release + 10
18 libdispatch.dylib              0x3aeef273 _dispatch_queue_drain$VARIANT$mp + 374
19 libdispatch.dylib              0x3aeef06b _dispatch_queue_invoke$VARIANT$mp + 42
20 libdispatch.dylib              0x3aeefce1 _dispatch_root_queue_drain + 76
21 libdispatch.dylib              0x3aeeff59 _dispatch_worker_thread2 + 56
22 libsystem_pthread.dylib        0x3b02adbf _pthread_wqthread + 298

在崩溃时,我可以发布其他线程,但唯一引起我的注意的是AFNetworking,但我在他们的问题中没有找到类似的内容。


看起来非常像使用已释放内存。如果您可以轻松地重现它,请尝试启用僵尸进程来运行。 - tc.
1
@tc。我们自己还没有看到这个崩溃,我们的QA也无法重现它。我们所拥有的只是Crashlytic消息 :/ - TJ Gillis
2个回答

7
我们也在Crashlytics上看到这种情况的报告,目前只发生在iOS 7设备上。当出现问题时,我们同时也有一个AFNetworking线程在运行。
从这个SO帖子中,我们发现将缓存设置为零似乎可以消除崩溃,但这不是一个永久的解决方案。
NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0
                                                        diskCapacity:0
                                                            diskPath:nil];
[NSURLCache setSharedURLCache:sharedCache];

我们有一些其他的NSURLCache代码,我们认为这些代码存在问题,目前正在测试中,我会随时向您更新。

更新

我们似乎已经解决了这个问题。我们认为解决崩溃的方法是在另一个代码部分使用它时,代码覆盖了[NSURLCache sharedURLCache]。我们删除了所有修改[NSURLCache sharedURLCache]的调用。


@DAMM108 更新了新的生产代码的初步结果。这是/是一个非常棘手的错误,我想知道你是否注意到了类似的情况。 - Michael M. Myers
是的,@Michael Myers,面对相同的问题并将NSURLCache设置为0解决了这个问题。 - DAMM108

0
我刚遇到了完全相同的崩溃问题。似乎是在设置自己更大的共享缓存之前我们使用了缓存。在应用程序启动后立即设置缓存可以解决这个问题。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    NSURLCache *URLCache = [[NSURLCache alloc] initWithMemoryCapacity:kNSURLCacheInMemorySize
                                                         diskCapacity:kNSURLCacheFileStorageSize
                                                             diskPath:nil];
    [NSURLCache setSharedURLCache:URLCache];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接