SQLite错误:EXC_BAD_INSTRUCTION(code = EXC_I386_INVOP,subcode = 0x0)-iOS

当我试图插入数据到我的表,有时我得到这个错误,我的应用程序崩溃!

请先解决我的问题。

在这里输入图像说明

崩溃日志:

Observation(4001,0x10dd67000) malloc: *** error for object 0x7fff3a917100: Non-aligned pointer being freed (2) *** set a breakpoint in malloc_error_break to debug 2016-11-03 11:12:03.063 Observation[4001:46477] Insertion failed ! Printing description of dbpath: (const char *) dbpath = 0x00007fff3b8a5690 "/Users/macbt/Library/Developer/CoreSimulator/Devices/0EEC62AE-6DF0-4FC4-9D30-1EB90CB695A5/data/Containers/Data/Application/A709E729-3162-4CC8-B9FF-2F22A32FC6BD/Documents/ObservationDB.db" Printing description of insertSQL: insert into table_hazard (id, name, modifiedDate) values ("1","Hazard", "03/11/2016 11:12:03 AM") Printing description of insert_stmt: (const char *) insert_stmt = 0x00007fff3b9291a1 "insert into table_hazard (id, name, modifiedDate) values (\"1\",\"Hazard\", \"03/11/2016 11:12:03 AM\")" 

  • 尝试在malloc_error_break上设置断点。

  • 释放它们后,将variables设置为零。

  • 仔细查看所有对sqlite3_prepare_v2指令的调用,并确保匹配的每个sqlite3_finalize被调用。

  • 添加@synchroinized块,使其线程安全

我相信这个问题可能是由于在不同的线程中同时访问数据库造成的。 你可以使用线程锁来解决这个问题。 你可以在@synchronized块里写数据库操作的代码来解决这个问题。 它可以执行如下。

 @synchronized (self) { // do the operation } 

请让我知道,如果它工作或不工作。 随意build议编辑。

这种types的问题的解决scheme是,您可能会缺less下面的声明。

  sqlite3_finalize(statement); sqlite3_close(database); 

之后

 sqlite3_open() sqlite3_prepare_v2() 

我们应该总是敲定声明并在返回语句之前closures数据库。 不要打开数据库。
没有最终确定的声明,并没有closures数据库,如果你试图再次打开它sqlite3_open()

要么

 sqlite3_prepare_v2() 

这将导致关于数据库的EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)

例如:

 -(BOOL) insertDropdownValues:(NSString *)tableName andId:(NSInteger) dID name:(NSString*) name modifiedDate:( NSString*) modifiedDate { const char *dbpath = [databasePath UTF8String]; if (sqlite3_open(dbpath, &database) == SQLITE_OK) { NSString *insertSQL = [NSString stringWithFormat:@"insert into %@ (%@, %@, %@) values (\"%ld\",\"%@\", \"%@\")",tableName,ID,NAME,MODIFIED_DATE, dID,name,modifiedDate]; const char *insert_stmt = [insertSQL UTF8String]; sqlite3_prepare_v2(database, insert_stmt,-1, &statement, NULL); if (sqlite3_step(statement) == SQLITE_DONE) { NSLog(@"Inserted SuccessFull"); sqlite3_finalize(statement); sqlite3_close(database); return YES; } else { NSLog(@"Insertion failed !"); sqlite3_finalize(statement); sqlite3_close(database); return NO; } } sqlite3_reset(statement); return NO; }