【问题标题】:Realm crash on Results.first.getterResults.first.getter 上的领域崩溃
【发布时间】:2020-07-30 00:09:23
【问题描述】:

领域 5.0.2

我试图了解这种崩溃是如何发生的。在 Realm Results 对象上调用 first 时崩溃。我猜这是一个并发问题,但是 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 正在处理查询,但没有崩溃。是否有另一个线程崩溃?可能需要显示一些LibraryTableViewController - 它看起来像refreshView 中的闭包回调正在调度对refreshFolders 的调用。
  • 你能添加你的 PersistentTag 对象的定义吗?我注意到的一件事是您将permanentId 作为整数查询,将temporaryId 作为字符串查询——这是否符合您的对象定义?还有userId的类型是什么?
  • 此问题已在最新领域修复。只需将您的领域更新到 5.3.3。

标签: crash realm realm-mobile-platform


【解决方案1】:

看来你不是唯一一个遇到这个问题的人。

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)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多