SQLite 代码 28 "file renamed while open"

Sqlite code 28 "file renamed while open"

这是 的推论。

我有一个 Mac 应用程序,它广泛使用了 sqlite。多个线程在未使用任何共享资源的情况下在 sqlite 代码中死锁。我已经设置了 sqlite_config_log via the sqlite3_config 功能,但我不断收到代码为 28 的消息:

file renamed while open:

Code 28 is SQLITE_WARNING. I found what appears to be the source code that logs that warning(在页面中搜索 "file renamed while open"),它似乎应该为我提供有问题的文件的路径,但日志语句中没有显示。我什至在我的日志函数中放置了一个断点并检查了 "file renamed" 字符串的内存,但那里没有文件名;它不仅仅是因为错误的空字符而切断了日志。

我也知道我实际上并没有重命名文件。它在文件创建后立即给我这个警告。并且相同的代码在 iOS 应用程序(链接到 sqlite 版本 3.7.13,而 Mac 为 3.8.5)中运行而没有生成警告。所以,问题是:除了重命名文件之外还有什么可能导致此警告?

更新:如果在对其运行任何语句之前将数据库转换为 DELETE 日志模式,则不会出现警告。

我能够通过将 latest version of SQLite 作为源代码捆绑到我的项目中而不是链接到 dylib 来解决这个问题。这是 sqlite 中的某种错误,可能是由于我的应用程序管理文件的方式,它在磁盘上创建一个空文件,然后将其传递给 sqlite 以创建数据库文件(而不是将 sqlite 传递给路径)空位置)。我目前 运行 3.8.8.2;我认为与 Yosemite 捆绑在一起的版本是 3.7.something。 iOS 8 中出现了相同的版本,并在我的同伴 iOS 应用程序中引起了同样的问题。

注意:如果将 sqlite 捆绑到 Xcode 项目中,请确保已定义 HAVE_USLEEP 否则 it'll sleep whole seconds waiting for locks.