SQLite зависает при выполнении sqlite3_step

Наше приложение начало регистрировать отчеты о сбоях, вызванных взаимоблокировкой в ​​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. Мы не можем воспроизвести сбой в отладочных сборках, и у нас нет действий для воспроизведения, но мы уверены, что он не зависит от запроса, поскольку он происходит в разных местах приложения, выполняя запросы только для чтения и изменения.

Как решить эту проблему или где найти ответ? Могу ли я что-нибудь добавить, чтобы помочь в исследовании проблемы?

0 ответов

Другие вопросы по тегам