在Results.first.getter上发生领域崩溃

时间:2020-07-30 00:09:23

标签: crash realm realm-mobile-platform

领域5.0.2

我正试图了解如何发生此崩溃。在领域first对象上调用Results时,它崩溃了。我猜这是一个并发问题,但是Realm与查询在同一线程上实例化,并且Realm对象立即转换为应用程序对象。但是,如果这不是并发问题,那么...什么?!

0
Thread 1 Queue : com.apple.main-thread (serial)
#0  0x00000001037d8f7c in realm::IndexArray::index_string_all(realm::StringData, std::__1::vector<realm::ObjKey, std::__1::allocator<realm::ObjKey> >&, realm::ClusterColumn const&) const ()
#1  0x00000001036c8fdc in realm::IntegerNode<realm::ArrayIntNull, realm::Equal>::init() ()
#2  0x00000001036a740c in realm::Query::init() const ()
#3  0x00000001036a74dc in realm::Query::find_all(realm::ConstTableView&, unsigned long, unsigned long, unsigned long) const ()
#4  0x0000000103866e7c in realm::ConstTableView::do_sync() ()
#5  0x00000001036a78d0 in realm::Query::find_all(unsigned long, unsigned long, unsigned long) ()
#6  0x00000001036a7d50 in realm::Query::find_all(realm::DescriptorOrdering const&) ()
#7  0x00000001033af2c4 in realm::Results::do_evaluate_query_if_needed(bool) 
#8  0x00000001033aeca8 in realm::util::Optional<realm::Obj> realm::Results::try_get<realm::Obj>(unsigned long) 
#9  0x00000001033af01c in realm::util::Optional<realm::Obj> realm::Results::first<realm::Obj>() 
#10 0x0000000103542b9c in _ZZN5realm7Results5firstI18RLMAccessorContextEEDaRT_ENKUlTyS4_E_clIPNS_3ObjEEES3_S4_ 
#11 0x0000000103541d38 in _ZN5realmL14switch_on_typeINS_3ObjEZNS_7Results5firstI18RLMAccessorContextEEDaRT_EUlTyS6_E_EES5_NS_12PropertyTypeEOT0_ 
#12 0x00000001035418c0 in _ZNK5realm7Results8dispatchIZNS0_5firstI18RLMAccessorContextEEDaRT_EUlTyS5_E_EES4_OS5_ 
#13 0x0000000103541870 in auto realm::Results::first<RLMAccessorContext>(RLMAccessorContext&) 
#14 0x0000000103541834 in -[RLMResults firstObject]::$_8::operator()() const 
#15 0x000000010353d5c4 in auto translateRLMResultsErrors<-[RLMResults firstObject]::$_8>(-[RLMResults firstObject]::$_8&&, NSString*) 
#16 0x000000010353d544 in -[RLMResults firstObject] 
#17 0x0000000104968cf4 in Results.first.getter 
#18 0x000000010228e97c in static LibraryManager.LibraryPersistence.findPersistentTag(permanentId:temporaryId:) 
#19 0x000000010228e500 in LibraryManager.getTag(forAssignment:) 
#20 0x000000010220c284 in closure #1 in AudiobookUserSettings.tags.getter 
#21 0x000000019eb5e038 in Sequence.compactMap<A>(_:) ()
#22 0x000000010220c1d0 in AudiobookUserSettings.tags.getter 
#23 0x0000000102195e70 in Audiobook.tags.getter 
#24 0x000000010226407c in FolderManager.updateFromLibrary() 
#25 0x00000001022ca78c in LibraryTableViewController.refreshFolders() 
#26 0x00000001022c6930 in closure #1 in LibraryTableViewController.refreshView() 
#27 0x0000000102150700 in thunk for @escaping @callee_guaranteed () -> () ()
#28 0x0000000104b7605c in _dispatch_call_block_and_release ()
#29 0x0000000104b774d8 in _dispatch_client_callout ()
#30 0x0000000104b85f64 in _dispatch_main_queue_callback_4CF ()
#31 0x00000001911cc8d4 in __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ ()
#32 0x00000001911c758c in __CFRunLoopRun ()
#33 0x00000001911c6bc8 in CFRunLoopRunSpecific ()
#34 0x000000019b5a85cc in GSEventRunModal ()
#35 0x0000000195379744 in UIApplicationMain ()
#36 0x00000001023d838c in main 
#37 0x0000000191043384 in start ()
Enqueued from audiobookSettings-persistence (Thread 33) Queue
#0  0x0000000104b7bdd0 in dispatch_async ()
#1  0x00000001c807004c in OS_dispatch_queue.async(group:qos:flags:execute:) ()
#2  0x00000001022c6808 in LibraryTableViewController.refreshView() 
#3  0x00000001022c6288 in closure #1 in LibraryTableViewController.viewWillAppear(_:) 

应用中的相关代码:

    func getTag(forAssignment assignment: TagAssignment) -> Tag? {
        let tag = LibraryPersistence.findPersistentTag(permanentId: assignment.permanentTagId,
                                                       temporaryId: assignment.temporaryTagId)
        return tag?.toTag()
    }

    static func findPersistentTag(permanentId: Int? = nil, temporaryId: String? = nil) -> PersistentTag? {
        guard let userId = getIdForCurrentUser() else {
            return nil
        }
        let realm = try! Realm()
        // First try lookup by permanent tag id
        if let permanentId = permanentId {
            let permanentIdNumber = NSNumber(value: permanentId)                
            if let stored = realm.objects(PersistentTag.self).filter("permanentId == %@ AND userId == %@", permanentIdNumber, userId).first {
                return stored
            }
        }
        // Then try temporary tag id
        if let temporaryId = temporaryId {
            return realm.objects(PersistentTag.self).filter("temporaryId == %@ AND userId == %@", temporaryId, userId).first
        }
        return nil
    }

更新:更多崩溃详细信息:

* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=EXC_I386_GPFLT)
#0: 0x0000000103bfc2fd Realm`realm::util::EncryptedFileMapping::read_barrier(void const*, unsigned long, unsigned long (*)(char const*)) + 29
  * frame #1: 0x00000001035ce000 Realm`realm::util::do_encryption_read_barrier(addr=0x00007fff87a95540, size=8, header_to_size=(Realm`realm::NodeHeader::get_byte_size_from_header(char const*) at node_header.hpp:201), mapping=0xca4c51df08c18be5)(char const*), realm::util::EncryptedFileMapping*) at file_mapper.hpp:133:14
#2: 0x0000000103b496ee Realm`realm::IndexArray::index_string_all(realm::StringData, std::__1::vector<realm::ObjKey, std::__1::allocator<realm::ObjKey> >&, realm::ClusterColumn const&) const + 398
...

1 个答案:

答案 0 :(得分:0)

看来您不是唯一遇到此问题的人。

https://github.com/realm/realm-cocoa/issues/6556

这看起来像是5.0.x的问题,有些已降级到4.x以解决该问题。它引用了已修复并合并但尚未发布的另一个问题(报告的底部)。

我已阅读了该错误报告,并查看这是否符合您的经验,然后(a)遵循变通方法,或(b)降级至4.4.x。观看修复问题(https://github.com/realm/realm-core/pull/3828)是否包含在新版本中。