2010-04-28 98 views
0

这是我的堆栈跟踪。我在哪里开始弄清楚这一点?我尝试了大量的NSLog(),我无法追踪它。在iPhone应用程序中调试EXC_BAD_ACCESS

#0 0x94e9ced7 in objc_msgSend() 
#1 0x04936318 in ??() 
#2 0x0259b252 in __CFRunLoopDoObservers() 
#3 0x0259a65f in CFRunLoopRunSpecific() 
#4 0x02599c48 in CFRunLoopRunInMode() 
#5 0x02ae7615 in GSEventRunModal() 
#6 0x02ae76da in GSEventRun() 
#7 0x0061dfaf in UIApplicationMain() 
#8 0x000051cc in main 
+0

静态分析器报告什么? (shift-command-A来分析) 你有NSZombieEnabled集吗?机会是你试图访问一个释放的对象。 – 2010-04-28 03:25:56

+0

我玩过NSZombieEnabled和乐器。这不是僵尸。 – Jeff 2010-04-28 04:04:43

+0

从你的堆栈没有什么可以评估...请把一些代码 – 2010-04-28 04:07:50

回答

0

下面是我如何跟踪这个。

首先,我走遍了使用的地方:

NSLog(@"%s", __PRETTY_FUNCTION__, nil); 

,以获得尽可能接近的崩溃。正如我所做的那样,我碰巧注意到它看起来像一个对象变得不应该是空的。

在这一点上,GDB与NSZombieEnabled和仪器都报告没有僵尸。

我将NSLog添加到我遇到问题的对象的dealloc和release方法。最后,我能够充分理解在这些方法中添加断点,并在每次发现堆栈跟踪时发现该版本被autorelease池调用。

我终于明白我没有保留我原本应该做的事。一旦我保留它,宾果,问题就解决了。

也就是说,NSZombieEnabled和乐器的建议都有助于其他一些自那时起就出现的错误,所以谢谢大家。

1

当应用程序与该堆栈跟踪崩溃时,打开调试控制台。

如果崩溃是在模拟器中,键入:

display /s $ecx 

如果设备上,键入:

display /s $r1 

确保NSZombieEnabled是OFF当你正在做这个。

它将打印系统尝试呼叫的方法的名称。

这种方式的工作原理是,当它崩溃时崩溃试图访问一个不存在的方法。所以这个方法的名字作为一个C字符串保存在一个寄存器中,这些行从寄存器中抓取并打印出来。