【问题标题】:"Thread 6 com.apple.NSURLConnectionLoader: Program received signal: EXC_BAD_ACCESS"“线程 6 com.apple.NSURLConnectionLoader:程序接收到的信号:EXC_BAD_ACCESS”
【发布时间】:2023-03-09 09:22:01
【问题描述】:

应用程序在启动后大约 15 秒崩溃,XCode 只是在一个地址处中断并给我一个弹出窗口,上面写着“线程 6 com.apple.NSURLConnectionLoader:程序收到的信号:EXC_BAD_ACCESS”

我完全无法找到问题所在。它在 iOS 4 上运行良好,但我猜这只是因为它更能容忍错误或其他东西。我已经尝试在各处设置断点并单步执行,在 Zombies 配置文件下的 Instruments 中运行它,但它只是爆炸了,并没有告诉我在哪里。我没有警告和清晰的分析,所以我有点不知所措。任何人都可以提供任何建议吗?谢谢。

回溯是:

(gdb) backtrace
#0  0x024fb939 in _dispatch_retain ()
#1  0x024fbc02 in dispatch_source_cancel ()
#2  0x0109e492 in _CFURLCacheDeallocate ()
#3  0x0205a4e3 in CFRelease ()
#4  0x010331b1 in HTTPProtocol::~HTTPProtocol ()
#5  0x0100c75d in CFClass::FinalizeObj ()
#6  0x0205a4e3 in CFRelease ()
#7  0x02110af0 in __CFDictionaryStandardReleaseValue ()
#8  0x020714b1 in __CFBasicHashDrain ()
#9  0x0205a4e3 in CFRelease ()
#10 0x01024237 in SocketStream::~SocketStream ()
#11 0x0100c75d in CFClass::FinalizeObj ()
#12 0x0205a4e3 in CFRelease ()
#13 0x01023e0b in SocketStream::finalize ()
#14 0x01023dc6 in virtual thunk to SocketStream::finalize(void const*) ()
#15 0x01023da1 in ReadStreamCallbacks::_finalize ()
#16 0x0208201a in __CFStreamDeallocate ()
#17 0x0205a4e3 in CFRelease ()
#18 0x01030a6c in HTTPReadFilter::~HTTPReadFilter ()
#19 0x0100c75d in CFClass::FinalizeObj ()
#20 0x0205a4e3 in CFRelease ()
#21 0x010c22bc in non-virtual thunk to HTTPReadFilter::readStreamFinalize(__CFReadStream*) ()
#22 0x0102ff1c in CFNetworkReadStream::httpStreamFinalize ()
#23 0x0208201a in __CFStreamDeallocate ()
#24 0x0205a4e3 in CFRelease ()
#25 0x0103070f in NetConnection::shutdownConnectionStreams ()
#26 0x010bf1fc in NetConnection::closeStreamsIfPossibleOrSignalThatThatNeedsToBeDonePrettyPlease ()
#27 0x0103485b in HTTPConnectionCacheEntry::removeUnauthConnection ()
#28 0x010d6d2d in HTTPConnectionCacheEntry::purgeIdleConnections ()
#29 0x010d3c1e in ConnectionCacheTLS::resetCacheForThisThread ()
#30 0x0101b739 in ConnectionTimerTLS::_timerPurgeEntries ()
#31 0x02122966 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ ()
#32 0x02122407 in __CFRunLoopDoTimer ()
#33 0x020857c0 in __CFRunLoopRun ()
#34 0x02084db4 in CFRunLoopRunSpecific ()
#35 0x02084ccb in CFRunLoopRunInMode ()
#36 0x00206e40 in +[NSURLConnection(Loader) _resourceLoadLoop:] ()
#37 0x001184e6 in -[NSThread main] ()
#38 0x00118457 in __NSThread__main__ ()
#39 0x98d6b259 in _pthread_start ()
#40 0x98d6b0de in thread_start ()

【问题讨论】:

  • 我只在 iOS 8 设备上遇到这个奇怪的错误,而它在 iOS9+ 上运行良好

标签: iphone objective-c ios xcode exc-bad-access


【解决方案1】:

在调试器中设置NSZombieEnabledMallocStackLoggingguard malloc。然后,当您的应用程序崩溃时,在 gdb 控制台中输入以下内容:

(gdb) info malloc-history 0x543216

0x543216 替换为导致崩溃的对象的地址,您将获得更有用的堆栈跟踪,它应该可以帮助您查明代码中导致问题的确切行。

See this article for more detailed instructions.

【讨论】:

  • 感谢您的帮助。我关注了this guide,但是当我输入 info malloc-history 和它跌倒的地址时,我什么也没得到。见this screengrab。你能想到为什么会这样吗?
  • 那是错误的十六进制地址。您想使用导致崩溃的实际对象的地址。查看是否有任何线程显示实际代码而不是寄存器,然后将鼠标悬停在该代码中的对象上以获取其十六进制地址。
  • 唯一给我任何代码的线程是线程 1,它具有 main 函数。我已经尝试了它在崩溃的线程中给我的每个地址。没有任何内容被注销到控制台,只是在崩溃之前 [切换到进程 53537 线程 0x5307]。我也尝试过注释掉项目中的所有 NSURLConnections ,但仍然没有骰子。感谢您的帮助,您还有什么可以建议的吗?
  • 嗯,你可以在 applicationDidFinishLaunching 方法中设置一个断点,然后逐行查找崩溃前执行的行。
  • 是的,我试过了,但它发生在应用程序完成启动大约 5 秒后的另一个线程中,我完成了所有代码的单步执行。我终其一生都找不到启动它或它在做什么。我想我会尝试在 mercurial 中恢复到项目的以前版本,看看是否有任何旧版本在 iOS 5 上工作。再次感谢您的输入。 :)
【解决方案2】:

上面评论中的修复最终并没有修复它,它仍然随机崩溃,几乎没有调试信息。

调试器连接到我的 iPhone 后,它给模拟器带来了不同的错误,我看到了对 NSURLCache 对象的引用。然后我记得我在尝试修复 NSURLConnection 对象中的内存泄漏时留下了一些旧代码...

NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil];
[NSURLCache setSharedURLCache:sharedCache];
[sharedCache release];

还有我上过的另一堂课……

    [[NSURLCache sharedURLCache] setMemoryCapacity:0];
    [[NSURLCache sharedURLCache] setDiskCapacity:0];

删除这些解决了问题,并向我解释了为什么很难追踪。在我看来,这就像 Apple 代码中的某个错误,因为在几乎没有错误消息的情况下进行追踪是一件非常痛苦的事情。

我希望这对其他人有所帮助。

【讨论】:

    【解决方案3】:

    感谢 iamichi 为追踪此错误所做的努力。这解决了我的问题。

    需要注意的一点:

    我和你一样从我的应用程序中删除了以下代码:

    NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil];
    [NSURLCache setSharedURLCache:sharedCache];
    [sharedCache release];
    

    并在应用程序委托中放置以下代码(未删除):

    [[NSURLCache sharedURLCache] setMemoryCapacity:0];
    [[NSURLCache sharedURLCache] setDiskCapacity:0];
    

    一切都好。谢谢!

    【讨论】:

    • 谢谢,知道这也很有用。很高兴这对您有所帮助,因为这有点让人头疼。
    • 你把这个放在 AppDelegate.m 文件的什么地方?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 2011-12-26
    相关资源
    最近更新 更多