2013-04-19 37 views
4

我们在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; 
} 

有没有人见过这个?是什么导致这次崩溃?在尝试执行prepare之前,我们正在检查SQL字符串是否为零,所以我不认为它是我们代码中的NULL指针解引用。

+1

对我来说同样的错误。我发现这是在进行大量准备时发生的,但仍未解决我的问题。 –

回答

1

我也有同样的错误。

我注意到,当多个INSERT/SELECT语句一个接一个地被触发时,它会发生。

我通过在sqlite代码中添加@synchronized块来修复它。

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

这是**的解决方案。 +1 – tipycalFlow

+0

你知道这是为什么吗? –