2013-04-19 3 views
4

Мы очень часто видим этот отчет о сбоях в нашей базе данных, ориентированной на iOS.Сбой SQLite в sqlite3DbMallocRaw

Exception Type: EXC_BAD_ACCESS (SIGSEGV) 
Exception Subtype: KERN_INVALID_ADDRESS at 0x0000001a 
Triggered by Thread: 3 

Thread 3 name: 
Thread 3 Crashed: 
0 libsqlite3.dylib    0x3a1fb150 sqlite3DbMallocRaw + 60 (sqlite3.c:19398) 
1 libsqlite3.dylib    0x3a1cf950 yy_reduce + 19164 (sqlite3.c:19499) 
2 libsqlite3.dylib    0x3a1cadbc sqlite3Parser + 252 (sqlite3.c:116602) 
3 libsqlite3.dylib    0x3a1ca558 sqlite3RunParser + 260 (sqlite3.c:117427) 
4 libsqlite3.dylib    0x3a1c9f18 sqlite3Prepare + 400 (sqlite3.c:99613) 
5 libsqlite3.dylib    0x3a1c9c68 sqlite3LockAndPrepare + 140 (sqlite3.c:99705) 
6 libsqlite3.dylib    0x3a204746 sqlite3_prepare_v2 + 26 (sqlite3.c:99784) 

Это всегда сбой при подготовке. Наш код для подготовки ничего особенного.

- (DBStatement *)_prepareStatement:(NSString *)sql error:(NSError **)error 
{ 
    if (sql == nil) { 
     return nil; 
    } 

    const char *sqlCStr = [sql UTF8String]; 
    sqlite3_stmt *stmt; 
    int result = sqlite3_prepare_v2(_db, sqlCStr, -1, &stmt, NULL); 
    if (result == SQLITE_OK) { 
     // create statement object 
    } 

    // ... 

    return statement; 
} 

Кто-нибудь видел это раньше? Что вызывает этот крах? Мы проверяем, является ли строка SQL нулевой, прежде чем пытаться выполнить подготовку, поэтому я не думаю, что это различие в NULL-указателе в нашем коде.

+1

Такая же ошибка для меня. Я выяснил, что это происходит, когда происходит много подготовительных мероприятий, но до сих пор не решена моя проблема. –

ответ

1

У меня тоже была такая же ошибка.

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

Я установил его, добавив @synchronized блок вокруг кода sqlite.

@synchronized (self){ 
    // sqlite code 
} 
+0

Это ** является ** решением. +1 – tipycalFlow

+0

Знаете ли вы, зачем это нужно? –

Смежные вопросы