Исключение ошибки перепутает регистр, вызвав сбои в [NSInvocation invoke]

112
7

У меня есть NSOperation, который извлекает некоторые объекты из основного хранилища данных и суммирует несколько итогов. Иногда объект удаляется во время текущей операции, поэтому возникает исключение сбоя основной информации. Я пытаюсь/улавливаю исключение при суммировании, чтобы игнорировать его, потому что просто хочу пропустить объекты, которые не могут быть повреждены.


Однако, когда происходит одно из этих исключений ошибок (и я его проглатываю), после возврата вызова в [NSInvocation invoke] происходит сбой. Это плохой доступ к памяти при разыменовании значения в r10, который согласно GDB при успешном запуске указывает на одно из следующих:


(gdb) x 0x38388348
0x38388348 <OBJC_IVAR_$_NSInvocation._retdata>: 0x00000008

Если произошло исключение ошибки, значение 0x02 находится в регистре, который вызывает сбой.


Быстрый поиск в Google сообщает мне, что r10 должен быть сохранен вызываемым пользователем, то есть он не восстанавливается каким-либо кодом, изменяющим его при возникновении этого исключения.


Может кто-нибудь объяснить это? Я не эксперт, когда речь заходит о таких низкоуровневых деталях.

спросил(а) 2010-06-09T13:33:00+04:00 10 лет, 3 месяца назад
1
Решение
57

Я думаю, вы задаете неправильный вопрос. Приложение Cocoa никогда не должно генерировать исключение при нормальной работе. Вам нужно решить причину этого исключения, прежде чем делать что-либо еще.


Вам не следует обращаться к одному контексту управляемого объекта из нескольких потоков, или если вам нужно очень осторожно его заблокировать. Многопоточный доступ к одному контексту крайне опасен и может привести к тому поведению, которое вы наблюдаете. Из раздела "Многопоточность с основными данными" в руководстве по программированию основных данных:

Если вы хотите работать с управляемым объект через разные потоки, вы должен блокировать его контекст (см. NSLocking). Если вы попытаетесь передать фактические объекты, разделять контексты между потоками и т.д. вы должны быть очень осторожны о блокировке (и, как следствие вы, вероятно, отрицаете какую-либо выгоду в противном случае вы можете получить многопоточный). Работа с управляемый объект через разные поэтому потоки сильно обескуражен, как описано в "General Руководство".



Рекомендуется использовать отдельный контекст управляемого объекта для вашего фонового потока (с тем же постоянным хранилищем и моделью управляемых объектов) и выполнять все чтения, необходимые для вашей операции суммирования.

ответил(а) 2010-06-16T01:28:00+04:00 10 лет, 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема