使用无效指针调试SEGV_ACCERR

时间:2013-08-04 14:36:41

标签: ios debugging crash arm

我有一个像这样的SIGSEGV / SEGV_ACCERR崩溃:

Thread 0 Crashed:
0   libobjc.A.dylib     0x39c69f2a _objc_release + 10
1   CoreFoundation      0x31cf4441 __CFAutoreleasePoolPop + 17
2   Foundation          0x326c8185 __NSThreadPerformPerform + 605
3   CoreFoundation      0x31d86683 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15
4   CoreFoundation      0x31d85ee9 __CFRunLoopDoSources0 + 213
5   CoreFoundation      0x31d84cb7 __CFRunLoopRun + 647
6   CoreFoundation      0x31cf7ebd _CFRunLoopRunSpecific + 357
7   CoreFoundation      0x31cf7d49 _CFRunLoopRunInMode + 105
8   GraphicsServices    0x358c32eb _GSEventRunModal + 75
9   UIKit               0x33c0d301 _UIApplicationMain + 1121
10  MyApp               0x0007471b main (main.m:15)

问题是SEGV_ACCERR地址始终无效。我看过以下地址:0xa21423020x51e9d2810x11e1af4e0x10。我的理解是_objc_release()内的SEGV_ACCERR地址应该是要释放的对象或其类对象的指针。如您所见,上面的前三个示例地址未对齐(假设malloc()仅返回16字节对齐的地址),最后一个显然是假的。

崩溃发生在__CFAutoreleasePoolPop(),这表明虚假指针以某种方式被自动释放池收集。我的理解是,自动释放池收集指针的唯一方法是成为收到-autorelease消息的有效Obj-C对象。

如果我的两个场所都是正确的,我的内存损坏情况很糟糕。换句话说,一个有效的Obj-C对象收到-autorelease,进入自动释放池,其内存位置被垃圾覆盖,当自动释放池试图释放它时,它取消引用了无效指针。

哪种类型的错误会破坏这样的内存?我可以想到memcpy() - 类似函数,堆栈溢出,缓冲区溢出。我还能找到什么?

以下是线程状态的典型示例。 SEGV_ACCERR地址总是 r1 + 16,r10 总是 0xa3a3a3a3r6 = r4 + 48,但这就是我所能说的。

Exception Type:  SIGSEGV
Exception Codes: SEGV_ACCERR at 0x51e9d281
...
Thread 0 crashed with ARM Thread State:
  r0: 0x1e865730     r1: 0x51e9d271     r2: 0x00000002     r3: 0xc4d443fb 
  r4: 0x1e0ff000     r5: 0x3bc64bd0     r6: 0x1e0ff030     r7: 0x2fdbdddc 
  r8: 0x1e0ff030     r9: 0x0015991c    r10: 0xa3a3a3a3    r11: 0x00000088 
  ip: 0x3bc5f800     sp: 0x2fdbddbc     lr: 0x39c69489     pc: 0x39c69f2a 
cpsr: 0x20000030 

不幸的是,我无法自己重现崩溃,所有报告都来自实际用户。非常感谢任何想法。

0 个答案:

没有答案