类方法的EXC_BAD_ACCESS KERN_INVALID_ADDRESS

时间:2015-10-13 16:58:06

标签: ios objective-c memory-management crash

我看到EXC_BAD_ACCESS KERN_INVALID_ADDRESS类方法。

根据我的理解,我不应该在类/静态方法中看到这一点。

我错过了什么吗?

堆栈追踪:

  

线程:崩溃:com.apple.root.user-initiated-qos

     

0 libobjc.A.dylib 0x0000000196eac0b4 objc_retain + 20

     

1 $ APP_NAME 0x00000001002611a8 + [$ CLASS_NAME $ METHOD_NAME:]($ CLASS_NAME.m:590)

     

2 libdispatch.dylib 0x0000000197511994 _dispatch_call_block_and_release + 24

     

3 libdispatch.dylib 0x0000000197511954 _dispatch_client_callout + 16

     

4 libdispatch.dylib 0x000000019751e780 _dispatch_root_queue_drain + 1848

     

5 libdispatch.dylib 0x000000019751fc4c _dispatch_worker_thread3 + 108

     

6 libsystem_pthread.dylib 0x00000001976f121c _pthread_wqthread + 816

     

7 libsystem_pthread.dylib 0x00000001976f0ee0 start_wqthread + 4

3 个答案:

答案 0 :(得分:2)

我已经看过几次这种崩溃(非常相似,如果不是相同的堆栈跟踪),并且发现它与使用新对象设置的非原子属性有关,同时被读取。

objc_retain +20指令结果是对正在读取的对象的isa属性的调用 - 但此时对象已被释放且isa指针已更改到一个糟糕的地址

我可以通过Mike Ash的博客文章调试我的问题: https://www.mikeash.com/pyblog/tales-from-the-crash-mines-issue-1.html

我强烈建议阅读整篇文章 - 它涉及使用反汇编程序进行调试,但它绝对是我们多次救命的用途

编辑:请注意,我绝对不会确定这是你的问题,但我希望我的轶事经验能为你节省一些时间。我知道我花了很多工作周来调试看起来像这样的问题,但我仍然不是100%

答案 1 :(得分:1)

此崩溃是由于指针悬空而发生的。 例如,当变量或对象试图访问已经取消分配的对象时。

P.S:大多数人可能对“内存泄漏” “悬空指针”

感到困惑 当指针引用已取消分配的内存时,会发生

悬挂指针内存泄漏发生在仍分配内存但没有引用该内存的情况下。

答案 2 :(得分:0)

EXC_BAD_ACCESS通常表示您向无效的内存地址发送了一个客观的C 消息

可能会导致:

1. An object that you want to use which has been deallocated.
2. When any variable or object is trying to access restricted memory. That means such crash occurs due to memory leak.