2013-04-19 2 views
4

Google의 iOS 대상 데이터베이스 프레임 워크에서이 충돌 보고서를 매우 자주 볼 수 있습니다.sqlite3DbMallocRaw에서 SQLite 충돌이 발생했습니다.

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 문자열이 nil인지 검사하고 있으므로 코드에서 역 참조가 아닌 NULL 포인터라고 생각하지 않습니다.

+1

같은 오류가 발생했습니다. 나는 많은 준비가있을 때 일어난다는 것을 알았지 만 여전히 나의 문제를 해결하지는 못했다. –

답변

1

나도 같은 오류가있었습니다.

많은 INSERT/SELECT 문이 차례로 발생했을 때 발생하는 것으로 나타났습니다.

sqlite 코드 주위에 @synchronized 블록을 추가하여 수정했습니다.

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

** 이것은 ** 해결책입니다. +1 – tipycalFlow

+0

왜 이것이 필요한지 아십니까? –

관련 문제