2013-04-19 39 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

你知道這是爲什麼嗎? –