ibireme / YYCache

High performance cache framework for iOS.
MIT License
2.37k stars 505 forks source link

YYKVStorage 异常crash #73

Open sanshanchuns opened 8 years ago

sanshanchuns commented 8 years ago

hey, ibireme 调用堆栈如下,什么样的情况会引起这种崩溃呢?本机无法复现,可线上却一直报错

SIGSEGV SEGV_ACCERR 0 libsqlite3.dylib 0x0000000195c2a6e4 sqlite3_bind_int + 18448 1 libsqlite3.dylib 0x0000000195c2a638 sqlite3_bind_int + 18276 2 libsqlite3.dylib 0x0000000195bebbf8 sqlite3_log + 22556 3 libsqlite3.dylib 0x0000000195bcdad8 sqlite3_exec + 12240 4 libsqlite3.dylib 0x0000000195bccba0 sqlite3_exec + 8344 5 libsqlite3.dylib 0x0000000195bcbe14 sqlite3_exec + 4876 6 libsqlite3.dylib 0x0000000195bcb66c sqlite3_exec + 2916 7 libsqlite3.dylib 0x0000000195bcb314 sqlite3_exec + 2060 8 0x000000010043b2e4 -YYKVStorage _dbPrepareStmt: 9 0x000000010043cf8c -YYKVStorage _dbGetItemCountWithKey: 10 0x000000010043f9b8 -YYKVStorage itemExistsForKey: 11 0x00000001004604a4 -YYDiskCache containsObjectForKey: 12 0x00000001004031b0 -YYCache containsObjectForKey:

ibireme commented 8 years ago

能提供一下 YYCache 版本和其他详细情况吗?这个暂时看不出来。。

jaminzzhang commented 8 years ago

这个应该是创建了相同路径的YYKVStorage对象,然后多线程同时访问导致的,我们之前也遇到了一样的问题。建议加下数据库访问锁。

li6185377 commented 7 years ago

957d4d3d-fa11-42f0-9b95-b9e9ba9d9f81

@ibireme 我 YYCache 都是单例,也出现这个错误了,YYCache (1.0.4)

luzsyn commented 5 years ago

@li6185377 我也是报这个错误,请问您是怎么解决这个问题的?

jaminzzhang commented 5 years ago

这个问题主要是因为在创建了多个相同路径YYCache实例,当这两个实例分别在不同线程去访问时,两个实例的锁相互不影响,就会访问同一个路径下的db文件,导致了Crash。两种方法:

  1. 检查初始化代码,不要创建多个同路径的YYCache。
  2. 在YYKVStorage的初始化代码里面做检查,发现之前已经创建了相同路径的实例。
luzsyn commented 5 years ago

@jaminzzhang 我是用的懒加载的属性,讲道理不会创建多个同路径的YYCache吧?

jaminzzhang commented 5 years ago

@bsyqc163 这个单例不标准啊,没有加锁,多线程访问有可能会创建多个。加锁试试,另外如果本地无法复现的话,建议加下日志,在Crash的时候上报是否创建了多个YYKVStorage

luzsyn commented 5 years ago

@jaminzzhang 好的,我试试,谢谢哈