【问题标题】:Crash in CFReadStreamCopyProperty from +[NSURLConnection(Loader) _resourceLoadLoop:]来自 +[NSURLConnection(Loader) _resourceLoadLoop:] 的 CFReadStreamCopyProperty 崩溃
【发布时间】:2015-02-27 01:49:39
【问题描述】:

我在 VOIP 应用程序的 CFNetwork 深处看到了这种崩溃的两种不同变体:

第一次出现:

线程 4 崩溃: 0 ??? 0x20333434 0x0 + 0 1 核心基础 0x2add4c6f CFReadStreamCopyProperty + 108 2 CFNetwork 0x2a898ae9 SPDYConnection::isCellular() + 26 3 CFNetwork 0x2a898a91 SPDYConnection::shouldIdleClose(double, double) + 58 4 CFNetwork 0x2a8a785b ___ZN24SPDYConnectionCacheEntry15shouldIdleCloseEdd_block_invoke + 32 5 核心基础 0x2ad17c7d CFArrayApplyFunction + 34 6 CFNetwork 0x2a8a781f SPDYConnectionCacheEntry::shouldIdleClose(double, double) + 136 7 CFNetwork 0x2a908fdb SPDYConnectionCache::_onqueue_purgeIdleConnections(bool) + 248 8 CFNetwork 0x2a86634d RunloopBlockContext::_invoke_block(void const*, void*) + 58 9 核心基础 0x2ad17c7d CFArrayApplyFunction + 34 10 CFNetwork 0x2a866207 RunloopBlockContext::perform() + 180 11 CFNetwork 0x2a8660cd MultiplexerSource::perform() + 214 12 CFNetwork 0x2a865f61 MultiplexerSource::_perform(void*) + 46 13 核心基础 0x2adcc377 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 12 14 核心基础 0x2adcb787 __CFRunLoopDoSources0 + 216 15 核心基础 0x2adc9ded __CFRunLoopRun + 770 16 核心基础 0x2ad18211 CFRunLoopRunSpecific + 474 17 核心基础 0x2ad18023 CFRunLoopRunInMode + 104 18 CFNetwork 0x2a8cdb9f +[NSURLConnection(Loader)_resourceLoadLoop:] + 484 19 基础 0x2bb14b5b __NSThread__main__ + 1116 20 libsystem_pthread.dylib 0x38cd0e93 _pthread_body + 136 21 libsystem_pthread.dylib 0x38cd0e07 _pthread_start + 116 22 libsystem_pthread.dylib 0x38cceb90 thread_start + 6

第二次出现:

线程 4 崩溃: 0 核心基础 0x2c34d1dc CFBasicHashFindBucket + 10416 1 核心基础 0x2c34a8eb CFDictionaryGetValue + 104 2 CFNetwork 0x2bea376d SocketStream::copyProperty(void const*, __CFString const*) + 114 3 核心基础 0x2c41dc6f CFReadStreamCopyProperty + 108 4 CFNetwork 0x2bee1ae9 SPDYConnection::isCellular() + 26 5 CFNetwork 0x2bee1a91 SPDYConnection::shouldIdleClose(double, double) + 58 6 CFNetwork 0x2bef085b ___ZN24SPDYConnectionCacheEntry15shouldIdleCloseEdd_block_invoke + 32 7 核心基础 0x2c360c7d CFArrayApplyFunction + 34 8 CFNetwork 0x2bef081f SPDYConnectionCacheEntry::shouldIdleClose(double, double) + 136 9 CFNetwork 0x2bf51fdb SPDYConnectionCache::_onqueue_purgeIdleConnections(bool) + 248 10 CFNetwork 0x2beaf34d RunloopBlockContext::_invoke_block(void const*, void*) + 58 11 核心基础 0x2c360c7d CFArrayApplyFunction + 34 12 CFNetwork 0x2beaf207 RunloopBlockContext::perform() + 180 13 CFNetwork 0x2beaf0cd MultiplexerSource::perform() + 214 14 CFNetwork 0x2beaef61 MultiplexerSource::_perform(void*) + 46 15 核心基础 0x2c415377 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 12 16 核心基础 0x2c414787 __CFRunLoopDoSources0 + 216 17 核心基础 0x2c412ded __CFRunLoopRun + 770 18 核心基础 0x2c361211 CFRunLoopRunSpecific + 474 19 核心基础 0x2c361023 CFRunLoopRunInMode + 104 20 CFNetwork 0x2bf16b9f +[NSURLConnection(Loader)_resourceLoadLoop:] + 484 21 基础 0x2d15db5b __NSThread__main__ + 1116 22 libsystem_pthread.dylib 0x3a775e93 _pthread_body + 136 23 libsystem_pthread.dylib 0x3a775e07 _pthread_start + 116 24 libsystem_pthread.dylib 0x3a773b90 线程启动 + 6

查看其他线程,第一个变体似乎在可达性发生变化时发生。当应用程序在后台运行并获得后台任务回调时,似乎会发生第二种变体。

我实际上并没有观察到这些崩溃,它们来自曲棍球崩溃报告。

关于如何追踪此问题的任何想法?

【问题讨论】:

  • 你能显示任何代码吗?
  • 我无法找到与它相关的应用程序代码。一段看似相关的代码是 +[AFURLConnectionOperation networkRequestThreadEntryPoint:]
  • 这里一样,同样的崩溃,也在 HockeyApp 中观察到这一点。
  • Fabric 崩溃报告中的相同问题。有人发现什么问题了吗?

标签: ios cfnetwork


【解决方案1】:

不幸的是,AFURLConnectionOperation 使用同步请求。我不知道他们为什么选择这样做,但 IMO,这是一种糟糕的做事方式;同步请求不会让您取消它们,每个请求都会泄漏一点 RAM,无法控制缓存等。

我已经看到了您在上面发布的回溯,以及在整个网络堆栈中随机出现的数百个其他崩溃。我能想到的唯一解释是 NSURLConnection 的某些部分在某些情况下没有正确保留其委托,并且崩溃似乎与发出的同步请求的数量成正比。

我的建议是,如果您绝对必须发出同步请求,请滚动您自己的同步包装类,该类从不同的线程异步使用 NSURLConnection,并使用 NSCondition 允许调用线程在连接完成后继续。

举个例子,看看我在这里实现的 MPSynchronousURLRequest 类:

https://github.com/dgatwood/mixpanel-iphone

它为您提供了一个完全透明的 sendSynchronousRequest 替代品,完全由您控制,因此您可以修改代码以处理缓存行为、以特定于应用程序的方式处理错误等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 2011-07-01
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    相关资源
    最近更新 更多