目标c – NSURLConnection在10.5.7之下崩溃

前端之家收集整理的这篇文章主要介绍了目标c – NSURLConnection在10.5.7之下崩溃前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个应用程序,下载股票价格,并正常工作(多年),直到我最近升级到10.5.7.升级后,程序会在此呼叫中崩溃:
NSString *currinfo = [NSString stringWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://finance.yahoo.com/d/quotes.csv?s=%@&f=l1c1p2",escsymbol]]];

奇怪的是,事故不会立即发生.这行代码被多次调用,没有任何问题,然后由于此次调用崩溃,程序最终会在1-2小时后失败.

我原来有一个很长的帖子,描述我试图调查这个问题.我收到两个建议:(i)使调用异步(可能更好),和(ii)使用NSZombieEnabled来调查Objective-C对象早期被释放的可能性(该评论是响应堆栈跟踪显示失败objc_msgSend).

我花了大量的时间使得调用异步(使用[[NSURLConnection alloc] initWithRequest:theRequest delegate:self]),这没有帮助.节目最终仍然失败,通常是在10-15分钟之后.在发生故障前的这段时间内,进行了许多异步调用,数据被返回等等.一切都很好.然后程序再次突然崩溃.

然后我打开NSZombieEnabled.果然,当程序最终崩溃时,我得到了消息:

-[CFArray count]: message sent to deallocated instance 0x16b90bd0

“info malloc 0x16b90bd0”然后产生:

0: 0x93db810c in malloc_zone_malloc
1: 0x946bc3d1 in _CFRuntimeCreateInstance
2: 0x9464a138 in __CFArrayInit
3: 0x946cd647 in _CFStreamScheduleWithRunLoop
4: 0x932d1267 in _Z16_scheduleRStreamPKvPv
5: 0x946bf15c in CFSetApplyFunction
6: 0x932b0e2b in CFNSchedulingSetScheduleReadStream
7: 0x9331a310 in _ZN12HTTPProtocol19createAndOpenStreamEv
8: 0x9332e877 in _ZN19URLConnectionLoader24loaderScheduleOriginLoadEPK13_CFURLRequest
9: 0x9332d739 in _ZN19URLConnectionLoader26LoaderConnectionEventQueue33processAllEventsAndConsumePayloadEP20XConnectionEventInfoI12XLoaderEvent18XLoaderEventParamsEl
10: 0x9332dbdd in _ZN19URLConnectionLoader13processEventsEv
11: 0x932d8dbf in _ZN17MultiplexerSource7performEv
12: 0x946ba595 in CFRunLoopRunSpecific
13: 0x946bac78 in CFRunLoopRunInMode
14: 0x9058c530 in +[NSURLConnection(NSURLConnectionReallyInternal) _resourceLoadLoop:]
15: 0x90528e0d in -[NSThread main]
16: 0x905289b4 in __NSThread__main__
17: 0x93de8155 in _pthread_start
18: 0x93de8012 in thread_start

我不是在阅读堆栈跟踪的专家,但是这个跟踪是否表示Apple代码中的问题,而不是我的代码?或者我可以以某种方式负责解散CFArray的问题?我有什么办法进一步调查问题的原因吗?

(这是我原来帖子的其余部分)

看到stringWithContentsOfURL已被弃用,我切换到这段代码

pathURL = [NSURL URLWithString:[NSString stringWithFormat:@"http://finance.yahoo.com/d/quotes.csv?s=%@&f=l1c1p2",escsymbol]];

NSURLRequest *request = [NSURLRequest requestWithURL:pathURL cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:30.0];

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

NSString *currinfo = nil;

if ([error code]) {  dNSLog((@"%@ %d %@ %@ %@",[ error domain],[ error code],[ error localizedDescription],request,@"file://localhost/etc/gettytab"));  }

这没有帮助该程序在任意一段时间内仍然在sendSynchronousRequest行上崩溃,调试器中包含此信息:

0   0x93db7286 in mach_msg_trap
1   0x93dbea7c in mach_msg
2   0x946ba04e in CFRunLoopRunSpecific
3   0x946bac78 in CFRunLoopRunInMode
4   0x932b53eb in CFURLConnectionSendSynchronousRequest
5   0x905dca4b in +[NSURLConnection sendSynchronousRequest:returningResponse:error:]

…等等.

真正的崩溃实际上可能在一个不同的线程:

0   libobjc.A.dylib                 0x965c3688 objc_msgSend + 24
1   com.apple.CoreFoundation        0x946cc581 _CFStreamSignalEventSynch + 193
2   com.apple.CoreFoundation        0x946ba595 CFRunLoopRunSpecific + 3141
3   com.apple.CoreFoundation        0x946bac78 CFRunLoopRunInMode + 88
4   com.apple.Foundation            0x9058c530 +[NSURLConnection(NSURLConnectionReallyInternal) _resourceLoadLoop:] + 320
5   com.apple.Foundation            0x90528e0d -[NSThread main] + 45
6   com.apple.Foundation            0x905289b4 __NSThread__main__ + 308
7   libSystem.B.dylib               0x93de8155 _pthread_start + 321
8   libSystem.B.dylib               0x93de8012 thread_start + 34

我认为是产生下载URL的线程.顺便问一下,错误处理代码工作正常 – 当我有意通过断开与互联网的连接造成错误时,错误只是在控制台中报告,程序不会崩溃.

这是非常令人沮丧的.我会很乐意花费尽可能多的时间来跟踪问题,但是我对gdb的了解甚至有限制,特别是汇编语言.我不知道如何找出基础代码的实际问题.起初我以为可能是自动释放的NSString escsymbol是以某种方式被释放,但发送一个保留信息没有帮助.如果是这样,我该怎么证明呢?

有人有这个问题吗?

解决方法

我认为尤金的回答是正确的描述了这个问题;经过一番测试,这里是我所得出的结论似乎正在发生,希望有一些细节可以帮助别人坚持这个问题:

重定向网址会定期导致失败.这发生在NSURLConnection的同步和异步使用.我创建了一个测试项目来跟踪这个错误,并且这种崩溃将一直发生(通常在25-500次迭代之间).在10.5.6或不重定向URL上运行相同的测试不会失败(最多可以运行20,000次迭代).

有两种可能的解决方法

>不要使用重定向网址:
显然,这并不总是可行的,但如果它是一个已知的URL,您仍然可以使用简单的调用(如stringWithContentsOfURL :),这样可以正常工作.丹尼斯,在你的情况下,正确的服务器URL是download.finance.yahoo.com,而不是finance.yahoo.com,所以我相信这将解决你的特殊问题.使用curl,您可以看到当您打到后一个地址时,您将获得301重定向.
>使用异步调用并实现连接:willSendRequest:redirectResponse:
如果您实现对代理方法的最基本的处理,一切似乎都可以正常工作.如果您不在此呼叫(因此让系统使用其默认实现),您将得到崩溃.对于基本的实现,只需返回传递的请求:

- (NSURLRequest *)connection:(NSURLConnection *)connection 
             willSendRequest:(NSURLRequest *)request 
            redirectResponse:(NSURLResponse *) redirectResponse
{
    return request;
}

所有这一切似乎对我来说,苹果在10.5.7中的实现有一些破坏,但如果任何人对于可能发生的事情有任何见解,请进来.

我已经将测试项目的一个bug提交给了苹果公司的rdar:// 6936109并引用了tjw的报告(Radar 6932684).

原文链接:https://www.f2er.com/c/114645.html

猜你在找的C&C++相关文章