2014-09-05 123 views
25

MyApp在98%的时间内工作良好,但有时会显示崩溃。它是如此随机。ios崩溃EXC_BAD_ACCESS KERN_INVALID_ADDRESS

崩溃报告显示以下内容。

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上遇到这些崩溃。 我怎么能找到它。所有帮助赞赏。

+1

显示的崩溃报告的顶部,请。尤其是例外代码。它是'0xbadfood'吗? – orkoden 2014-09-05 10:14:52

+0

没有异常代码是0xf000000c,0x0000000f。这两个崩溃都有相同的堆栈。 – 2014-09-05 10:27:11

+0

使用ExceptionHandler,请在这里查看我的答案:http://stackoverflow.com/questions/10501358/objective-c-getting-line-number-or-full-stack-trace-from-debugger-error/25551171#25551171 – 2014-09-05 11:25:30

回答

20

由于内存泄漏而发生此崩溃。当任何变量或对象试图访问受限制的内存时,就会发生这种崩溃。

+5

这可能是由于将消息发送给已释放的对象。但看着堆栈跟踪,我不明白它可能出错了,并且项目完全在ARC中。 – 2014-09-05 10:34:25

+2

使用任何块? – stevesliva 2014-09-06 04:30:46

+1

@ stevesliva为什么块会成为问题?[我正在使用它们,并且出现类似的错误] – ripegooseberry 2015-04-22 09:36:31

11

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

+0

谢谢指出。是的,这不是由于内存泄漏。史蒂夫斯利瓦添加了一条评论帮助。这是由于块和物体过早释放。这就是为什么堆栈跟踪也不清楚。 – 2017-08-03 15:35:24

-2

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 

}]; 
+0

这是不正确的;发送一个'nil' weakSelf就像在ObjC中发送任何其他'nil'一样,这是一个无用的操作并且很好。如果你要发送多条消息,你只需要'强化'弱引用,以确保它不会被部分解除分配。 – buildsucceeded 2017-08-30 09:17:27

+0

也许我没有清楚地描述过,但是你重复我的想法,我同意你的看法。 – akaDuality 2017-08-31 09:49:46

相关问题