在iPhone应用程序中调试EXC_BAD_ACCESS

时间:2010-04-28 03:19:18

标签: iphone debugging

这是我的堆栈跟踪。我从哪里开始弄清楚这一点?我已经尝试了大量的NSLog(),我无法追踪它。

#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

2 个答案:

答案 0 :(得分:1)

当应用程序崩溃时,打开调试控制台。

如果崩溃在模拟器中,请输入:

display /s $ecx

如果在设备上,请输入:

display /s $r1

执行此操作时,请确保NSZombieEnabled OFF

它将打印系统试图调用的方法的名称。

它的工作方式是,当它崩溃时崩溃试图访问一个不存在的方法来调用。因此,方法的名称作为C-String保存在寄存器中,这些行从寄存器中获取并打印出来。

答案 1 :(得分:0)

以下是我追踪此事的方法。

首先,我使用以下方式去了所有地方:

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

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

此时,带有NSZombieEnabled和仪器的GDB都报告没有僵尸。

我将NSLog-ing添加到我遇到问题的对象的dealloc和release方法中。最后,当我发现自动释放池正在调用释放时,我能够充分理解在这些方法中添加断点并查看堆栈跟踪。

我终于想通了,我没有留下我原本应该做的事情。一旦我保留它,宾果游戏,问题就解决了。

尽管如此,NSZombieEnabled和Instruments建议都有助于解决自那时以来出现的其他一些错误,所以感谢所有人。