Руководство нужно для отладки журнала сбоя - PullRequest
0 голосов
/ 12 октября 2011
#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 ]

1 голос
/ 14 октября 2011

Установить MallocStackLogging и guard malloc в отладчике.Затем, когда произойдет сбой вашего приложения, введите его в консоли gdb:

(gdb) info malloc-history 0x543216

Замените 0x543216 на адрес объекта, вызвавшего сбой, и вы получите гораздо более полезную трассировку стека, и это должно помочьВы указываете точную строку в своем коде, которая вызывает проблему.

0 голосов
/ 08 декабря 2011

Это произошло из-за одновременного доступа к базе данных ядра из двух разных потоков, т.е. основного потока и фонового потока

0 голосов
/ 14 октября 2011

Добавьте точку останова на Исключения (Xcode 4 делает это довольно легко), затем перезапустите и выведите приложение из строя.Скорее всего, вы получите точку останова прямо в тот момент, когда происходит сбой.Оттуда вы можете po различные объекты, пока не дойдете до того, который вызывает отладчик, чтобы жаловаться.

Если у вас NSZombieEnabled и он не вызывает исключение из-за перевыпуска, то вы, вероятно, просто получаете доступ к освобожденномуобъект.Лучшее предотвращение этого - nil любой объект, который вы отпускаете.

...