NSURLConnectionLoader 线程中的奇怪崩溃

Posted

技术标签:

【中文标题】NSURLConnectionLoader 线程中的奇怪崩溃【英文标题】:Weird crash in NSURLConnectionLoader thread 【发布时间】:2013-09-12 23:11:48 【问题描述】:

我们开始看到我们的应用启动时发生的崩溃。 我无法重现它,而且它只发生在少数用户身上。

异常是:异常类型:EXC_BAD_ACCESS 代码:KERN_INVALID_ADDRESS at 0x3250974659

崩溃发生在名为 com.apple.NSURLConnectionLoader 的线程中 打电话时-[NSBlockOperation main]

这是该线程的堆栈跟踪:

0 libobjc.A.dylib objc_msgSend + 9 1 基础 - [NSBlockOperation 主] + 200 2 基础-[__NSOperationInternal start] + 840 3 基础-[_NSCFURLProtocolBridgeWithTrampoline processEventQ] + 344 4 基础-[_NSCFURLProtocolBridgeWithTrampoline pushEvent:from:] + 298 5 基础 -[_NSCFURLProtocolBridge 停止] + 88 6 基础 _bridger + 64 7 CFNetwork __block_global_7 + 24 8 CFNetwork __block_global_8 + 12 9 CFNetwork ___performAsync_block_invoke_068 + 18 10 核心基础 CFArrayApplyFunction + 176 11 CFNetwork RunloopBlockContext::perform() + 74 12 CFNetwork MultiplexerSource::perform() + 188 13 核心基础 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 14 14 核心基础 __CFRunLoopDoSources0 + 212 15 核心基础 __CFRunLoopRun + 646 16 核心基础 CFRunLoopRunSpecific + 356 17 核心基础 CFRunLoopRunInMode + 104 18 基础 +[NSURLConnection(Loader)_resourceLoadLoop:] + 308 19 基础 __NSThread__main__ + 972 20 libsystem_c.dylib _pthread_start + 308

如果能帮助您了解导致此类崩溃的原因,我们将不胜感激。

【问题讨论】:

很可能您正在使用已释放的对象。 你找到它的原因了吗?我第一次在 ios 7 上看到这个。对你来说,这与 IOS7 有关吗? 不,这是在 ios6 中 【参考方案1】:

在我看来,这段代码间接导致了崩溃。如果我正确阅读了故障转储

[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]

正在触发 NSURLConnectionLoaderThread。这可能是他们用于异步支持的内容。但是当我使用同步请求时,我无法在线程运行时释放对象。如果你问我,那是 IOS 7 中的一个错误。

NSMutableURLRequest* request = [self setupRequestWithService:service andMethod:operation];

    [request addValue:CONTENT_TYPE_APPLICATION_JSON forHTTPHeaderField:REQUEST_HEADER_CONTENT_TYPE];
    [request setHTTPMethod:@"POST"];

    NSError* error = nil;
    NSData* jsonData = nil;

    NSAssert(message,@"Message must not be null");

    jsonData = [NSJSONSerialization dataWithJSONObject:[message toDictionary] options:kNilOptions error:&error];

    NSAssert(! error, @"Message could not be json serialized");

    Log(@"----------------------------------------------------------------------");
    Log(@"JSON DATA: - %@", [[NSString alloc] initWithData:jsonData
                                                     encoding:NSUTF8StringEncoding]);
    Log(@"----------------------------------------------------------------------");

    [request setHTTPBody:jsonData];

    // Send Synchronous Request
    NSURLResponse *response = nil;
    error = nil;
    NSData* responseData = nil;
    NSString* responseString = nil;

    responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

【讨论】:

我们在 iOS7 上看到了同样的行为。我们的崩溃报告都没有提到 iOS6,我们也无法在内部重现它。你想清楚了吗? 我在使用同步 URL 请求时看到了类似的行为。我的建议是永远不要使用它们。它们是不可取消的、有问题的,它们会为每个请求泄漏一点内存,并且它们在幕后有无法解释的僵尸问题。最好重写代码以使用异步方法。它们实际上并不难使用。【参考方案2】:

我的猜测(因为没有代码,所有答案都会猜测) - 在块执行之前,您是否正在释放块中使用的对象。

粘贴代码以便我们提供更多帮助。

【讨论】:

没有真正可以粘贴的代码,因为我不知道是哪个代码导致了它。没有与我的代码关联的堆栈跟踪。

以上是关于NSURLConnectionLoader 线程中的奇怪崩溃的主要内容,如果未能解决你的问题,请参考以下文章

如何确定线程池中线程数量

java中开启子线程后主线程中传入的变量不变

Android 异步操作Android 线程切换 ( 判定当前线程是否是主线程 | 子线程中执行主线程方法 | 主线程中执行子线程方法 )

C++怎么在主线程中使用子线程的数据? 比如说主线程中有一个数组,如何在子线程中调用这个数组

java 如何获得线程池中正在执行的线程数?

c# 怎么等待线程池中所有线程都运行结束在运行主线程