неверная контрольная сумма для освобожденного объекта. Чрезвычайно странный сбой в приложении - PullRequest
1 голос
/ 18 января 2012

Я уже некоторое время работаю над приложением. До сих пор я запускал его, пока отладчик был подключен, и он работал хорошо (потому что NSZombies был включен) ...

Недавно я заметил, что при нажатии на новый контроллер представления приложение зависает. Я подумал, что это будет простое решение, но пока все выглядит не так.

Приложение работает следующим образом (этот метод работал ранее) ...

  1. Пользователь выбирает вид
  2. RootViewController помещается в tableViewController
  3. Пользователь выбирает элемент
  4. ViewController инициализирован и настроен
  5. Контроллер навигации выдвигает на новый ViewController

Теперь, если я настрою свою схему для включения NSZombies, то это будет работать нормально ... мой новый вид загружается и начинает работать.

Однако .. если я не сделаю, приложение вылетает!

В моем окне консоли появляется следующая ошибка:

2012-01-17 19:51:14.599 DrivingInstructor[61946:17003] -[PhotoViewController loadView]
2012-01-17 19:51:14.654 DrivingInstructor[61946:17003] -[PhotoViewController viewWillAppear:]
DrivingInstructor(61946,0xac6ad2c0) malloc: *** error for object 0x92b0e14: incorrect checksum for freed object - object was probably modified after being freed.
*** set a breakpoint in malloc_error_break to debug

Итак, я установил malloc_error_break, чтобы увидеть, что происходит ... не имеет значения, я все еще получаю вышеуказанную ошибку (обратите внимание, что первые два сообщения показывают, что мой новый ViewController инициализируется)

Если я запустил обратную трассировку после сбоя .. вот мой вывод:

#0  0x956a9c97 in malloc_error_break ()
#1  0x9566b4ce in szone_error ()
#2  0x9566b54e in free_list_checksum_botch ()
#3  0x9566b63f in tiny_free_list_remove_ptr ()
#4  0x956702b1 in szone_free ()
#5  0x01f30a98 in __CFAllocatorSystemDeallocate ()
#6  0x01f2978a in CFAllocatorDeallocate ()
#7  0x01f30960 in CFRelease ()
#8  0x01fe6b4f in __CFDictionaryStandardReleaseKey ()
#9  0x01f474df in __CFBasicHashDrain ()
#10 0x01f304e3 in CFRelease ()
#11 0x02011e94 in -[__NSArrayM dealloc] ()
#12 0x021c8e4d in _objc_rootRelease ()
#13 0x021c8e10 in objc_release ()
#14 0x021c9c60 in (anonymous namespace)::AutoreleasePoolPage::pop ()
#15 0x01f58ed8 in _CFAutoreleasePoolPop ()
#16 0x015f08ce in __NSFireDelayedPerform ()
#17 0x01ff8966 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ ()
#18 0x01ff8407 in __CFRunLoopDoTimer ()
#19 0x01f5b7c0 in __CFRunLoopRun ()
#20 0x01f5adb4 in CFRunLoopRunSpecific ()
#21 0x01f5accb in CFRunLoopRunInMode ()
#22 0x023e2879 in GSEventRunModal ()
#23 0x023e293e in GSEventRun ()
#24 0x00cd8a9b in UIApplicationMain ()
#25 0x00002149 in main (argc=1, argv=0xbffff5d4) at main.m:14

Я должен также указать ... Сначала я думал, что это вызвано тем, что я запускаю фоновый поток, который изменяет размеры изображений для меня, пока загружается пользовательский интерфейс, поэтому нет зависания, так как мой первый журнал аварийных отключений предполагал, что он зависал на определенная строка в моем классе обработки изображений, но после невозможности отсортировать это и закомментировать функцию, которая изменяет размеры изображений (работает в фоновом потоке) .. Теперь приложение не работает даже без вызова этого потока!

Я не знаю, что случилось с моими первоначальными журналами аварий, когда мне сообщали, что это была проблема с использованием UIGraphics в фоновом потоке, когда происходил сбой ...

Теперь просто вылетает: S

Вот мой аварийный журнал ниже:

(вставлять, когда я превышаю 3к символов) http://pastebin.com/dGF7QdeH

Я бы поделился кодом с приложением, в котором возникает эта проблема, но я не знаю, где это происходит, поэтому не могу показать вам: S

Из того, что я вижу, вызывается функция viewWillAppear :, поэтому я могу настроить свое представление, но оно падает до того, как я на самом деле нажимаю на него, но в настройке представления нет ничего необычного, так как единственный код, который я изменил так как последняя рабочая версия настраивает мой взгляд (что работает нормально)

Если кто-нибудь сможет мне помочь с этим, я буду ОЧЕНЬ благодарен ... Я весь день подчеркивал это, и публикация здесь - мое последнее средство (прежде чем я зайду на developer.apple.com)

Спасибо за чтение. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

* * Ли тысяча сорок-девять

Ответы [ 5 ]

3 голосов
/ 18 января 2012

Прежде всего, выясните, что это за объект 0x92b0e14. (или любой другой адрес, который отображается в вашем отладчике.) Как только вы узнаете, что это за объект, ставьте точки останова везде, где вы их освобождаете, и ставьте точку останова там, где вы получаете ошибку. Когда вы нажимаете на релиз до того, как обнаружите ошибку, вы видите, в чем проблема.

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

1 голос
/ 18 января 2012

Вы что-то спрятали в главном потоке, а фоновый поток сперва отключал его.

Когда ничего не помогает, вы можете использовать двоичный поиск, чтобы найти проблему. Создайте новый #define, например, SEARCH_BUG = 1, затем используйте #ifdef SEARCH_BUG, чтобы закомментировать обширные области кода. Если оставить «Зомби» включенным и включить писанину, а все остальное, скорее всего, обнаружит ошибку быстрее, чем без нее.

Это приложение для iPhone, запустите его в симуляторе и на аппаратном обеспечении - iPad - и т. Д., Возможно, проблема проявится раньше на реальном оборудовании или в симуляторе.

0 голосов
/ 17 марта 2018

Я нашел функцию free_list_checksum_botch () в Apple с открытым исходным кодом.

https://opensource.apple.com/source/Libc/Libc-825.26/gen/magazine_malloc.c

Попытка поместить журнал ошибок "неверная контрольная сумма для освобожденного объекта - объект, вероятно, был изменен после освобождения."

0 голосов
/ 18 января 2012

Не знаю, поможет ли это, но несколько раз, когда я сталкивался с ошибкой malloc, два экземпляра одного и того же класса контроллера представления непреднамеренно существовали в моей иерархии контроллера представления.Попробуйте поместить NSLog(@"init: %@", self); в init() и NSLog(@"dealloc: %@", self); контроллеров представления в их dealloc(), затем сравните имена классов и адреса экземпляров.

0 голосов
/ 18 января 2012

Этот стек выглядит так, как будто что-то перевыпускается. (Что менее вероятно, если вы действительно включили обнаружение зомби.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...