这是我的堆栈跟踪。我从哪里开始弄清楚这一点?我已经尝试了大量的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
答案 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建议都有助于解决自那时以来出现的其他一些错误,所以感谢所有人。