指导需要调试崩溃日志

时间:2011-10-12 08:00:05

标签: iphone ipad core-data nsoperation nsoperationqueue

#0  0x345bbc98 in objc_msgSend ()
#1  0x35cd3616 in -[_PFManagedObjectReferenceQueue _processReferenceQueue:] ()
#2  0x35cd32b2 in _performRunLoopAction ()
#3  0x31458a34 in __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ ()
#4  0x3145a464 in __CFRunLoopDoObservers ()
#5  0x3145b75a in __CFRunLoopRun ()
#6  0x313ebec2 in CFRunLoopRunSpecific ()
#7  0x313ebdca in CFRunLoopRunInMode ()
#8  0x354d941e in GSEventRunModal ()
#9  0x354d94ca in GSEventRun ()
#10 0x36a03d68 in -[UIApplication _run] ()
#11 0x36a01806 in UIApplicationMain ()
#12 0x00002b6a in main (argc=1, argv=0x2fdff494) at /Projects/iOS_Universal/main.m:14

我怎么知道哪个对象过度发布。我的应用程序运行NSZombieEnabled也尝试了一些gdb命令但没有得到任何帮助

3 个答案:

答案 0 :(得分:1)

在调试器中设置MallocStackLoggingguard malloc。然后,当您的应用程序崩溃时,请在gdb控制台中输入:

(gdb) info malloc-history 0x543216

将0x543216替换为导致崩溃的对象的地址,您将获得更有用的堆栈跟踪,它可以帮助您查明代码中导致问题的确切行。

答案 1 :(得分:0)

在Exceptions上添加一个断点(Xcode 4使这很简单)然后重新运行并崩溃你的应用程序。您可能会在碰撞发生时获得一个断点。从那里你可以po各种对象,直到你遇到导致调试器抱怨的对象为止。

如果您有NSZombieEnabled并且它没有在过度发布上抛出异常,那么您可能只是访问已发布的对象。最好的预防方法是nil您释放的任何对象。

答案 2 :(得分:0)

这是由于来自两个不同线程的核心数据db的并发访问,即主线程&后台线程