Отладка SIGABRT в NSManagedObjectContext -save: - PullRequest
13 голосов
/ 22 декабря 2010

Изнутри NSManagedObjectContext -save: я получаю это сообщение:

Ошибка подтверждения: (_Unwind_SjLj_Resume () не может быть возвращена), функция _Unwind_SjLj_Resume, файл /SourceCache/libunwind/libunwind-24.1/src/Unwind-sjlj.c, строка 326.

Программа получила сигнал: «SIGABRT».

предупреждение: невозможно прочитать символы для /Developer/Platforms/iPhoneOS.platform/DeviceSupport/4.2.1 (8C148) /Symbols/Developer/usr/lib/libXcodeDebuggerSupport.dylib (файл не найден).

Это происходит, когда я удаляю объект Experiment с to-many с помощью Run, который имеет to-many с Sample, с to-one с Data. Эксперимент также имеет-многие с Page, который имеет-многие с Display, который должен-многие для запуска. Я упоминаю об этом, чтобы указать на циклический характер графа. Вот упрощенный график модели:

alt text

Экспериментальный объект верхнего уровня, с которым взаимодействует пользователь. Эксперимент содержит несколько объектов Run. Прогон - это набор данных, начинающийся в определенное время и заканчивающийся позднее. Поскольку данные могут быть собраны из нескольких источников одновременно, для каждого прогона имеется образец для каждого прогона. Эксперимент содержит данные, и эти данные необходимо просматривать и взаимодействовать с ними. Таким образом, каждый эксперимент имеет определенное количество объектов Page, а каждая страница содержит некоторое количество дисплеев (например, графики, метры). Дисплей сконфигурирован для отображения некоторого поднабора прогонов, которые принадлежат эксперименту. Таким образом, хотя эксперимент может содержать десятки прогонов, на одной из его страниц будет отображаться только несколько прогонов за раз. Объект Display поддерживает этот список. Дисплей не вид. Представление будет ссылаться на экранный объект и получать уведомления об изменениях экранного объекта.

Я использовал правила удаления, но теперь переключился на правила удаления «Без действий» в сочетании с методами -prepareForDeletion для всех этих классов. Это изменение не имело никакого значения. В обоих случаях сообщение об ошибке одинаково.

Интересно, что при повторном запуске приложения все объекты, помеченные для удаления, были удалены.

Кроме того, если в эксперименте нет объектов «Выполнить», удаление выполняется без инцидентов. В этом отношении удаление одного прогона из эксперимента также работает.

Я надеюсь, что кто-то видел что-то подобное и может дать совет о том, что может вызвать это. Или, если у кого-то есть совет, как получить libXcodeDebuggerSupport.dylib для iOS 4.2.1, это также может быть полезно.

Обновление: Я следовал совету, найденному здесь и смог получить Xcode, чтобы найти libXcodeDebuggerSupport.dylib для iOS 4.2.1. Но это совсем не помогло в диагностике проблемы, которая сохраняется.

Обновление 2: После небольшого прочтения и загрузки версии unwind-sjlj.c кажется, что я имею дело с чем-то вроде необработанного исключения. Я не уверен, как это помогает мне ...

Обновление 3: Благодаря Камчатке я сделал то, что, вероятно, должен был сделать несколько дней назад: включил «Остановка исключений Objective-C». Это позволило мне увидеть, что ссылка на удаленный объект все еще удерживается - и, что еще хуже, это значение ключа, наблюдающее за удаленным объектом. Исправление этой исправленной проблемы, и я смог вернуться к использованию правил удаления вместо методов -prepareForDeletion.

1 Ответ

16 голосов
/ 26 декабря 2010

Вы должны попытаться активировать «Выполнить> Остановить исключение Objective-C». Это позволило мне найти место, где был доступ к объекту, превратившемуся в ошибку, которая была основной причиной проблемы.

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