ios崩溃EXC_BAD_ACCESS KERN_INVALID_ADDRESS

时间:2014-09-05 10:00:42

标签: ios objective-c ios7.1 cfnetwork

MyApp在98%的情况下运行良好,但有时会显示崩溃。它是如此随意。

崩溃报告显示以下内容。

Thread : Crashed: com.apple.main-thread
0  libobjc.A.dylib                0x3b1ae626 objc_msgSend + 5
1  Foundation                     0x310e2381 _netServiceMonitorCallBack + 104
2  CFNetwork                      0x302ea3b5 _QueryRecordReply(_DNSServiceRef_t*, unsigned int, unsigned int, int, char const*, unsigned short, unsigned short, unsigned short, void const*, unsigned int, void*) + 324
3  libsystem_dnssd.dylib          0x3b7289d9 handle_query_response + 168
4  libsystem_dnssd.dylib          0x3b72773f DNSServiceProcessResult + 582
5  CFNetwork                      0x302ea3e5 _SocketCallBack_Mon(__CFSocket*, unsigned long, __CFData const*, void const*, void*) + 20
6  CoreFoundation                 0x30691189 __CFSocketPerformV0 + 580
7  CoreFoundation                 0x3068efaf __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 14
8  CoreFoundation                 0x3068e477 __CFRunLoopDoSources0 + 206
9  CoreFoundation                 0x3068cc67 __CFRunLoopRun + 630
10 CoreFoundation                 0x305f7729 CFRunLoopRunSpecific + 524
11 CoreFoundation                 0x305f750b CFRunLoopRunInMode + 106
12 GraphicsServices               0x355336d3 GSEventRunModal + 138
13 UIKit                          0x32f58871 UIApplicationMain + 1136
14 MyApp                          0x0013f813 main (main.m:16)

所有这些看起来都是内部方法。我确实在运行iOS 7.1.2的iPad 4上遇到了这些崩溃。 我怎么能把它钉下来呢。所有人都很感激。

3 个答案:

答案 0 :(得分:33)

这是一个老问题,但EXC_BAD_ACCESS KERN_INVALID_ADDRESS崩溃不是由于内存泄漏,而是由于尝试访问已释放的对象。因为释放对象的内存现在可能被另一个不同类型的对象占用,所以崩溃堆栈中的最后一行可能是错误引导的,因为它实际上并不是编程执行路径的一部分,所以通常我们需要查找跟踪一点点。但是@Sj发布的堆栈跟踪基本上只包含系统调用,所以它真的很难。如果这是在调试会话中生成的,则添加“All Exceptions”断点可能有助于生成更具信息性的堆栈跟踪。

答案 1 :(得分:26)

由于悬空指针而发生此崩溃。当任何变量或对象试图访问已经解除分配的对象时,就会发生此崩溃。

答案 2 :(得分:-3)

  

EXC_BAD_ACCESS KERN_INVALID_ADDRESS崩溃不是由于内存泄漏,   但由于试图访问解除分配的对象。

示例:如果您使用__weak typeof(self) weakSelf = self;并且在您访问块内之前已释放对象,则会发生崩溃。原因 - 访问错误的内存地址,因为对象已被释放。

要防止在块内使用__strong typeof(self) strongSelf = self;Nil值将在没有崩溃的情况下正确处理

注意:使用此代码示例进行快速工作。

#define weakify(var) __weak typeof(var) AHKWeak_##var = var;

#define strongify(var) \
_Pragma("clang diagnostic push") \
_Pragma("clang diagnostic ignored \"-Wshadow\"") \
__strong typeof(var) var = AHKWeak_##var; \
_Pragma("clang diagnostic pop")

用法示例:

weakify(self); // Remove retain cycle
[self someFunctionWithBlock:^{
    strongify(self); // Make reference to address valid

}];