У меня есть приложение, которое широко использует Realm в качестве внутреннего хранилища. Недавно я столкнулся с проблемой, которая возникает на некоторых устройствах, но не на всех. Я действительно открыл выпуск , но, так как приложение очень серьезно падает, я надеюсь, что я также смогу получить некоторое представление отсюда.
Каждый раз, когда я пытался вставить сообщение в область, оно вылетало. Сначала я использовал 3.18.0 и столкнулся с этой проблемой, затем увидел ошибку, упомянутую в # 6268 и # 6257 . Я обновляю до версии 3.20.0, и кажется, что проблема все еще появилась. Ниже приведена ссылка на журнал ошибок.
Журнал:
Другой журнал:
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0 libsystem_kernel.dylib 0x000000019ba1e0dc 0x19b9fb000 + 143580
1 libsystem_pthread.dylib 0x000000019ba9b9b0 0x19ba95000 + 27056
2 libsystem_c.dylib 0x000000019b977f4c 0x19b91d000 + 372556
3 libsystem_c.dylib 0x000000019b977eb4 0x19b91d000 + 372404
4 Realm 0x0000000106023918 realm::util::terminate+ 3176728 (char const*, char const*, long) + 0
5 Realm 0x0000000106023be4 realm::util::terminate_internal+ 3177444 (std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >&) + 264
6 Realm 0x0000000106023d5c realm::util::terminate+ 3177820 (char const*, char const*, long, std::initializer_list<realm::util::Printable>&&) + 328
7 Realm 0x0000000105d4db38 realm::Column<long long>::do_erase(unsigned long, unsigned long, bool) + 203576 (column.hpp:1606)
8 Realm 0x00000001060b60e0 realm::sync::TableInfoCache::get_table_info+ 3776736 (unsigned long) const + 1908
9 Realm 0x00000001060b6bf8 realm::sync::create_object_with_primary_key+ 3779576 (realm::sync::TableInfoCache const&, realm::Table&, realm::util::Optional<long long>) + 52
10 Realm 0x0000000105d9a400 realm::Object realm::Object::create<objc_object* __strong, RLMAccessorContext>(RLMAccessorContext&, std::__1::shared_ptr<realm::Realm> const&, realm::ObjectSchema const&, objc_object* __strong, bool, bool, unsigned long, realm::BasicRow<realm::Table>*) + 517120 (object_accessor.hpp:0)
11 Realm 0x0000000105d9a090 RLMAddObjectToRealm + 516240 (RLMObjectStore.mm:152)
12 <myapp> 0x0000000104b4b4a4 MyClass.insertRealmMessage(_:scrollToBottom:) + 357540 (MyClass+Realm.swift:0)
13 <myapp> 0x0000000104c04010 specialized MyClass.handle(_:something:) + 1114128 (MyClass+Socket.swift:0)
14 <myapp> 0x0000000104bec4a0 MyClass.process(_:didReceive:) + 1016992 (MyClass.swift:0)
15 <myapp> 0x0000000104ba84b8 closure #1 in MyClass.stream(_:didReceive:) + 738488 (MyClass.swift:0)
16 <myapp> 0x0000000104b0c8cc thunk for @escaping @callee_guaranteed () -> () + 100556 (<compiler-generated>:0)
17 libdispatch.dylib 0x000000019b8c0a38 0x19b861000 + 391736
18 libdispatch.dylib 0x000000019b8c17d4 0x19b861000 + 395220
19 libdispatch.dylib 0x000000019b8a19e4 0x19b861000 + 264676
20 CoreFoundation 0x000000019be11ec0 0x19bd68000 + 696000
21 CoreFoundation 0x000000019be0cdf8 0x19bd68000 + 675320
22 CoreFoundation 0x000000019be0c354 0x19bd68000 + 672596
23 GraphicsServices 0x000000019e00c79c 0x19e002000 + 42908
24 UIKitCore 0x00000001c83f7b68 0x1c7b3d000 + 9153384
25 <myapp> 0x0000000104afbcd0 main + 31952 (User.swift:29)
26 libdyld.dylib 0x000000019b8d28e0 0x19b8d1000 + 6368
Другой журнал:
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0 libsystem_kernel.dylib 0x000000019ba1e0dc 0x19b9fb000 + 143580
1 libsystem_pthread.dylib 0x000000019ba9b9b0 0x19ba95000 + 27056
2 libsystem_c.dylib 0x000000019b977f4c 0x19b91d000 + 372556
3 libsystem_c.dylib 0x000000019b977eb4 0x19b91d000 + 372404
4 Realm 0x00000001018f3918 realm::util::terminate+ 3176728 (char const*, char const*, long) + 0
5 Realm 0x00000001018f3be4 realm::util::terminate_internal+ 3177444 (std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >&) + 264
6 Realm 0x00000001018f3d5c realm::util::terminate+ 3177820 (char const*, char const*, long, std::initializer_list<realm::util::Printable>&&) + 328
7 Realm 0x000000010161db38 realm::Column<long long>::do_erase(unsigned long, unsigned long, bool) + 203576 (column.hpp:1606)
8 Realm 0x00000001019860e0 realm::sync::TableInfoCache::get_table_info+ 3776736 (unsigned long) const + 1908
9 Realm 0x0000000101986bf8 realm::sync::create_object_with_primary_key+ 3779576 (realm::sync::TableInfoCache const&, realm::Table&, realm::util::Optional<long long>) + 52
10 Realm 0x000000010166a400 realm::Object realm::Object::create<objc_object* __strong, RLMAccessorContext>(RLMAccessorContext&, std::__1::shared_ptr<realm::Realm> const&, realm::ObjectSchema const&, objc_object* __strong, bool, bool, unsigned long, realm::BasicRow<realm::Table>*) + 517120 (object_accessor.hpp:0)
11 Realm 0x000000010166a090 RLMAddObjectToRealm + 516240 (RLMObjectStore.mm:152)
12 <myapp> 0x000000010047ebb0 MyClass.handle(realmMessage:shouldGenerateAutoIncrement:) + 207792 (MyClass.swift:0)
13 <myapp> 0x0000000100482588 specialized MyClass.handle(_:chat:) + 222600 (MyClass.swift:0)
14 <myapp> 0x00000001005444a0 MyClass.function(_:didReceive:) + 1016992 (MyClass.swift:0)
15 <myapp> 0x00000001005004b8 closure #1 in MyClass.strem(_:didReceive:) + 738488 (MyClass.swift:0)
16 <myapp> 0x00000001004648cc thunk for @escaping @callee_guaranteed () -> () + 100556 (<compiler-generated>:0)
17 libdispatch.dylib 0x000000019b8c0a38 0x19b861000 + 391736
18 libdispatch.dylib 0x000000019b8c17d4 0x19b861000 + 395220
19 libdispatch.dylib 0x000000019b8a19e4 0x19b861000 + 264676
20 CoreFoundation 0x000000019be11ec0 0x19bd68000 + 696000
21 CoreFoundation 0x000000019be0cdf8 0x19bd68000 + 675320
22 CoreFoundation 0x000000019be0c354 0x19bd68000 + 672596
23 GraphicsServices 0x000000019e00c79c 0x19e002000 + 42908
24 UIKitCore 0x00000001c83f7b68 0x1c7b3d000 + 9153384
25 <myapp> 0x0000000100453cd0 main + 31952 (User.swift:29)
26 libdyld.dylib 0x000000019b8d28e0 0x19b8d1000 + 6368
Шаги по воспроизведению
Я не могу воспроизвести проблему, похоже, что это происходит только с устройством, которое было предварительно установлено и обновлено до новой версии, я попытался переустановить более старые версииприложение и имитировать процесс обновления, до сих пор нет результата.
Почти каждое из действий INSERT объекта сообщения может привести к сбою в соответствии с моими клиентами. Это может произойти в любом месте приложения, которое делает такую вещь, ниже приведен пример.
Пример первый:
realm.beginWrite()
conversation.unread += 1
realm.add(message, update: Realm.UpdatePolicy.all)
// Update Conversation Timestamp
conversation.lastMessageTimestamp = message.timestamp
do {
try realm.commitWrite()
} catch let error {
log.debug("Unable to create Message")
log.debug(error.localizedDescription)
return
}
Пример второй:
realm.beginWrite()
realm.add(newRealmMessage, update: Realm.UpdatePolicy.error)
// Update Conversation Timestamp
if let conversation = newRealmMessage.conversation {
conversation.lastMessageTimestamp = newRealmMessage.timestamp
}
DispatchQueue.main.async {
/*Some UI Modification*/
}
commit()
Естьв других местах, где я делаю похожие вещи и, кажется, получаю тот же результат.