YYCache
YYCache copied to clipboard
YYKVStorage 异常crash
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:
能提供一下 YYCache 版本和其他详细情况吗?这个暂时看不出来。。
这个应该是创建了相同路径的YYKVStorage对象,然后多线程同时访问导致的,我们之前也遇到了一样的问题。建议加下数据库访问锁。
@ibireme 我 YYCache 都是单例,也出现这个错误了,YYCache (1.0.4)
@li6185377 我也是报这个错误,请问您是怎么解决这个问题的?
这个问题主要是因为在创建了多个相同路径YYCache实例,当这两个实例分别在不同线程去访问时,两个实例的锁相互不影响,就会访问同一个路径下的db文件,导致了Crash。两种方法:
- 检查初始化代码,不要创建多个同路径的YYCache。
- 在YYKVStorage的初始化代码里面做检查,发现之前已经创建了相同路径的实例。
@jaminzzhang 我是用的懒加载的属性,讲道理不会创建多个同路径的YYCache吧?
- (YYDiskCache *)momentCache { if (!_momentCache) { _momentCache = [[YYDiskCache alloc] initWithPath:[NSString stringWithFormat:@"%@/Library/Caches", NSHomeDirectory()]]; } return _momentCache; }
@bsyqc163 这个单例不标准啊,没有加锁,多线程访问有可能会创建多个。加锁试试,另外如果本地无法复现的话,建议加下日志,在Crash的时候上报是否创建了多个YYKVStorage
@jaminzzhang 好的,我试试,谢谢哈