EXC_BAD_ACCESS в SQLite в Mac OS

Я извлекаю и отправляю данные из базы данных sqlite. Я использую какао-обертку FMDatabase.

Я извлекаю и отправляю данные из нескольких потоков, но я позаботился о том, чтобы одновременно не происходило более одной транзакции.

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

Вот стек и код:

http://grab.by/1VwY

FMResultSet* result = [db executeQuery:@"select latitude, longitude from cache where name = ?", name];
[result next];

NSString* latitude = [result stringForColumn:@"latitude"];
NSString* longitude = [result stringForColumn:@"longitude"];

Понятия не имею, есть ли у кого-нибудь?


person gcamp    schedule 23.01.2010    source источник
comment
Вы пробовали регистрировать (или распечатывать в отладчике) значение name? Что произойдет, когда вы это сделаете?   -  person Peter Hosey    schedule 24.01.2010
comment
Да, это абсолютно нормально. Это ожидаемое имя.   -  person gcamp    schedule 24.01.2010
comment
Это также не связано с памятью. Да, определенно так. EXC_BAD_ACCESS точно связан с памятью.   -  person Joshua Nozzi    schedule 24.01.2010
comment
Я знаю, я имел в виду, что, по крайней мере, виновато не мое управление памятью.   -  person gcamp    schedule 24.01.2010


Ответы (1)


Просматривая соответствующий код в FMDatabase, кажется, что процедуры sqlite_bind_text() используют параметр SQLITE_STATIC для привязки метода -UTF8String результата NSString (который возвращает указатель autoreleased).

Это означает, что SQLite предполагает, что текстовое хранилище будет оставаться действительным, пока текст остается связанным, в то время как возврат -UTF8String действителен только для текущего контекста автозапуска. Если вы используете один и тот же FMResultSet для нескольких потоков или вызовов функций, изменение этого параметра на SQLITE_TRANSIENT будет намного безопаснее.

Я бы посоветовал вносить это изменение при каждом sqlite3_bind_text() вызове и проверять, вылетает ли он по-прежнему. Если это исправит, вы можете сообщить об этом разработчику как о возможном улучшении.

person Boaz Stuller    schedule 24.01.2010
comment
В этом есть смысл. Спасибо, тестирую! - person gcamp; 24.01.2010
comment
Не вносил никаких изменений…: / По-прежнему вылетает так же. - person gcamp; 24.01.2010
comment
Ну что ж. Я подозреваю, что нам нужно увидеть больше кода, чтобы понять, что было не так. Одна вещь, которую вы можете сделать, чтобы помочь, - это загрузить объединение sqlite и скомпилировать с ним свой проект. Таким образом вы получите полные символы отладки и сможете включить макрос препроцессора SQLITE_DEBUG. - person Boaz Stuller; 24.01.2010
comment
Очистил и пересобирал проект, и он работает! Спасибо! Сообщу об этом и Гасу! - person gcamp; 24.01.2010
comment
gcamp, вы решили эту проблему? Переход на переходный процесс не решил для меня (я не использую наборы результатов для нескольких потоков) - person Piotr; 08.06.2011