【问题标题】:iphone : random EXC_BAD_ACCESS with NSURLConnectioniphone:带有 NSURLConnection 的随机 EXC_BAD_ACCESS
【发布时间】:2010-09-15 12:16:11
【问题描述】:

我有时会收到关于 NSURLConnection 的 EXC_BAD_ACCESS 的崩溃报告(根据崩溃报告,我猜这是关于 NSURLConnection 的)。

我在 StackOverflow 上发现了一个带有相同报告的问题,但没有任何帮助:/ (NSURLConnection causes bad access crash);我尝试使用 NSZombieEnabled 运行该应用程序,但由于这个问题真的是“随机的”,我在使用 NSZombieEnabled 运行时从未设法得到它:/

谁有提示?

非常感谢:)

这是一份报告:

Thread 3 Crashed:
0   libobjc.A.dylib                0x0000286c objc_msgSend + 16
1   CoreFoundation                 0x0000325c CFEqual + 92
2   CoreFoundation                 0x000b081c __CFBasicHashStandardEquateKeys + 12
3   CoreFoundation                 0x000b2578 ___CFBasicHashFindBucket_Linear + 216
4   CoreFoundation                 0x00002ff8 CFBasicHashFindBucket + 220
5   CoreFoundation                 0x00002ec6 CFDictionaryGetValue + 50
6   CFNetwork                      0x0005853a HTTPMessage::copyConstantHeaderFieldValue(unsigned int) const + 26
7   CFNetwork                      0x00090024 URLRequest::copyConstantHeaderFieldValue(unsigned int) const + 20
8   CFNetwork                      0x0008ce0e HTTPProtocol::getCacheStoragePolicy(__CFHTTPMessage*) + 158
9   CFNetwork                      0x0008e6c8 HTTPProtocol::updateForHeader(__CFHTTPMessage*) + 492
10  CFNetwork                      0x0008f73c HTTPProtocol::performHeaderRead() + 368
11  CFNetwork                      0x0008fbea HTTPProtocol::httpReadStreamEvent(unsigned long) + 110
12  CFNetwork                      0x0008fd34 HTTPProtocol::_httpReadStreamCB(__CFReadStream*, unsigned long, void*) + 4
13  CoreFoundation                 0x0004985e _signalEventSync + 70
14  CoreFoundation                 0x000497f2 _cfstream_shared_signalEventSync + 198
15  CoreFoundation                 0x00071a86 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 6
16  CoreFoundation                 0x000736ac __CFRunLoopDoSources0 + 188
17  CoreFoundation                 0x00074504 __CFRunLoopRun + 224
18  CoreFoundation                 0x0001d8e4 CFRunLoopRunSpecific + 224
19  CoreFoundation                 0x0001d7ec CFRunLoopRunInMode + 52
20  Foundation                     0x0003b71e +[NSURLConnection(NSURLConnectionReallyInternal) _resourceLoadLoop:] + 206
21  Foundation                     0x0000bc96 -[NSThread main] + 38
22  Foundation                     0x000909da __NSThread__main__ + 966
23  libSystem.B.dylib              0x0007a986 _pthread_start + 242
24  libSystem.B.dylib              0x000700e4 thread_start + 0

更新

我终于在 NSZombieEnabled 开启时得到了错误...但它并没有多大帮助:/

这是回溯:

[Switching to thread 13059]
Program received signal:  “EXC_BAD_ACCESS”.
[Switching to thread 13059]
(gdb) bt
#0  0x3090ce9c in CFDictionaryGetValue ()
#1  0x35233540 in HTTPMessage::copyConstantHeaderFieldValue ()
#2  0x3526b02a in URLRequest::copyConstantHeaderFieldValue ()
#3  0x35267e14 in HTTPProtocol::getCacheStoragePolicy ()
#4  0x352693e2 in HTTPProtocol::attemptToCacheMovedPermanently ()
#5  0x3526a6c8 in HTTPProtocol::performHeaderRead ()
#6  0x3526abf0 in HTTPProtocol::httpReadStreamEvent ()
#7  0x3526ad3a in HTTPProtocol::_httpReadStreamCB ()
#8  0x30953864 in _signalEventSync ()
#9  0x309537f8 in _cfstream_shared_signalEventSync ()
#10 0x3097ba8c in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ ()
#11 0x3097d6b2 in __CFRunLoopDoSources0 ()
#12 0x3097e50a in __CFRunLoopRun ()
#13 0x309278ea in CFRunLoopRunSpecific ()
#14 0x309277f2 in CFRunLoopRunInMode ()
#15 0x3148b724 in +[NSURLConnection(NSURLConnectionReallyInternal) _resourceLoadLoop:] ()
#16 0x3145bc9c in -[NSThread main] ()
#17 0x314e09e0 in __NSThread__main__ ()
#18 0x3129298c in _pthread_start ()
#19 0x312880ec in thread_start ()
(gdb) 

【问题讨论】:

  • 如果我看不到你的代码真的很难知道。在这种情况下,代码检查是最好的,也可能是唯一的方法
  • 好吧,我无法向您展示代码,因为我不知道代码的哪一部分可能会导致此错误:/ 必须提供整个项目的源代码。同样,这是非常随机的,崩溃报告也没那么有用

标签: iphone nsurlconnection exc-bad-access


【解决方案1】:

我不确定是否有足够的信息来提供很多帮助:-(

首先,坚持使用 NSZombie's - 我相信您迟早会实现的。请务必检查控制台输出,nszombie 抛出的异常可能会在某处被捕获和忽略。

除此之外,请仔细检查您对内存所做的一切。确保请求在被释放之前被取消,你不会不小心用另一个请求覆盖指向正在运行的请求的指针,确保你没有过度释放你传递给请求的任何对象。

可能会或可能不会解决您的问题的最后一个建议是尝试 ASIHTTPRequest:

http://allseeing-i.com/ASIHTTPRequest/

它可以做 NSURLConnection 可以做的所有事情(此外还有很多有用的事情),如果你仍然遇到崩溃,你至少会有源代码,这样你就可以获得更多关于问题所在的信息。

【讨论】:

  • 刚刚出现 NSZombieEnabled 错误...但回溯并没有太大帮助:
  • 您可以将回溯和任何控制台输出编辑到问题中吗?
  • 我正在尝试使用 XCode 调试器(带断点)向我展示哪个线程正在使用崩溃的 NSURLConnection,但我无法让它回溯其父级;任何想法? :)
  • 您提供的回溯来自 NSURLConnection 的线程(即开始运行请求的线程)-我不确定您是否可以回到原始线程。请注意,NSURLConnection 回调将到达您启动请求的线程,因此请注意不要杀死该线程等。
  • 您也许能够识别它是哪个请求。首先,在您开始请求的每个地方添加一个 NSLog(@"starting NSURLConnection %p", request),然后如果您向上导航回溯,您可能会在“self”或类似的地方找到相同的指针值。
【解决方案2】:

好的,我找到了解决方案/问题。

我的代码没问题,问题的根源是我试图使用这些 NSURLConnections 从我的网站获取图像...但是我们的 SEO 人员更改了图像 url,所以我重定向了请求。

NSURLConnection 不太喜欢重定向请求。

感谢您的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多