SQLite在执行sqlite3_step时冻结

SQLite freezes while performing sqlite3_step

提问人:Andriy 提问时间:7/17/2023 最后编辑:user4157124Andriy 更新时间:7/17/2023 访问量:102

问:

我们的应用程序开始记录由 SQLite 中的死锁引起的崩溃报告:

Exception Type:  EXC_CRASH (SIGKILL)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Termination Reason: RUNNINGBOARD 0xdead10cc

它发生在我们应用程序的 iPhone/iPad 版本中。我们使用系统内置的SQLite库和开放数据库,设置如下:

int err = sqlite3_open_v2(db_path, &db, SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE | SQLITE_OPEN_FULLMUTEX, nil);

报告指示应用在某个非主线程处冻结,执行以下操作:

Thread 2 name:
Thread 2:
0   libsystem_kernel.dylib          0x00000001ea5fcd9c pread + 8 (:-1)
1   libsqlite3.dylib                0x00000001d065a228 seekAndRead + 96 (sqlite3.c:41646)
2   libsqlite3.dylib                0x00000001d05d3078 unixRead + 208 (sqlite3.c:41738)
3   libsqlite3.dylib                0x00000001d05e5e60 readDbPage + 180 (sqlite3.c:64270)
4   libsqlite3.dylib                0x00000001d0663ca8 getPageNormal + 488 (sqlite3.c:66892)
5   libsqlite3.dylib                0x00000001d066f388 getAndInitPage + 100     (sqlite3.c:76131)
6   libsqlite3.dylib                0x00000001d06705f8 moveToLeftmost + 136 (sqlite3.c:79298)
7   libsqlite3.dylib                0x00000001d05f93b4 sqlite3VdbeExec + 5000 (sqlite3.c:102042)
8   libsqlite3.dylib                0x00000001d05f75b4 sqlite3_step + 984 (sqlite3.c:94140)

某些崩溃报告具有以下堆栈:

Thread 3 name:
Thread 3:
0   libsystem_kernel.dylib          0x00000001df2adc88 fsync + 8 (:-1)
1   libsqlite3.dylib                0x00000001c52c7d18 unixSync + 212 (sqlite3.c:42244)
2   libsqlite3.dylib                0x00000001c52d0560 syncJournal + 576 (sqlite3.c:65600)
3   libsqlite3.dylib                0x00000001c52c78a4 sqlite3PagerCommitPhaseOne + 392 (sqlite3.c:67879)
4   libsqlite3.dylib                0x00000001c52b871c sqlite3BtreeCommitPhaseOne + 172 (sqlite3.c:78021)
5   libsqlite3.dylib                0x00000001c52b81ec vdbeCommit + 688 (sqlite3.c:90610)
6   libsqlite3.dylib                0x00000001c5290998 sqlite3VdbeHalt + 1320 (sqlite3.c:91020)
7   libsqlite3.dylib                0x00000001c52b29b4 sqlite3VdbeExec + 43400 (sqlite3.c:99633)
8   libsqlite3.dylib                0x00000001c52a75b4 sqlite3_step + 984 (sqlite3.c:94140)

甚至这个:

Thread 4 name:
Thread 4:
0   libsqlite3.dylib                0x00000001eb90ef18 accessPayload + 312 (sqlite3.c:78866)
1   libsqlite3.dylib                0x00000001eb8f4634 sqlite3VdbeMemFromBtree + 200 (sqlite3.c:87070)
2   libsqlite3.dylib                0x00000001eb8e9e24 sqlite3VdbeExec + 40440 (sqlite3.c:98870)
3   libsqlite3.dylib                0x00000001eb8df5b4 sqlite3_step + 984 (sqlite3.c:94140)

这些是来自不同崩溃日志的摘录,没有对 SQLite lib 的任何其他调用。我们无法在调试版本上重现崩溃,也没有重现步骤,但确信它不依赖于查询,因为它发生在整个应用的不同位置,执行只读和修改查询。

如何解决这个问题或在哪里找到答案?我可以添加什么来帮助调查问题吗?

iOS iphone ios-sqlite

评论

0赞 Wander Nauta 7/17/2023
这回答了你的问题吗?崩溃,终止原因0xdead10cc
0赞 Andriy 7/17/2023
不,它没有回答这个问题。我们已经知道存在僵局,我们已经进行了一些研究来排除某些假设。
2赞 Wander Nauta 7/17/2023
具体来说,该链接文档建议“使用 beginBackgroundTask 在主线程上请求额外的后台执行时间。在开始写入文件之前,请发出此请求,以便在应用程序挂起之前完成这些操作并放弃锁定。你已经这样做了吗?我问的原因是,问题中的所有回溯似乎都在做某事的过程中捕获了sqlite,而不是徘徊等待锁定。你可能只是需要更多的时间。
0赞 Bill 7/17/2023
数据库是否位于共享容器中?
0赞 Andriy 7/17/2023
是的。数据库位于组容器中。

答: 暂无答案