获得致命信号11(SIGSEGV),使用Realm编写代码1

时间:2016-09-24 09:51:19

标签: android realm

这个错误似乎是由本机代码中的错误引起的,这是由Realm库引起的 - 基于错误下面的“构建指纹”中的短语librealm-jni.so。我安装了最新版本的Realm - 1.2.0。

这是错误代码:

Fatal signal 11 (SIGSEGV), code 1, fault addr 0x14c in tid 7837 (ator.app)

这是“构建指纹:”

    Build fingerprint: 'generic/vbox86p/vbox86p:5.0/LRX21M/buildbot11172321:userdebug/test-keys'
26643-26643/? I/DEBUG: Revision: '0'
26643-26643/? I/DEBUG: ABI: 'x86'
26643-26643/? I/DEBUG: pid: 7837, tid: 7837, name: ator.app  >>> com.lockedout.app <<<
26643-26643/? I/DEBUG: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x14c
26643-26643/? I/DEBUG:     eax 00000148  ebx ffffffff  ecx 7470d340  edx 00000002
26643-26643/? I/DEBUG:     esi 00000000  edi 00000002
26643-26643/? I/DEBUG:     xcs 00000023  xds 0000002b  xes 0000002b  xfs 00000007  xss 0000002b
26643-26643/? I/DEBUG:     eip e2f6d025  ebp ffd3cd58  esp ffd3cd50  flags 00210246
26643-26643/? I/DEBUG: backtrace:
26643-26643/? I/DEBUG:     #00 pc 0002a025  /data/app/com.lockedout.app-1/lib/x86/librealm-jni.so
26643-26643/? I/DEBUG:     #01 pc 0009c141  /data/app/com.lockedout.app-1/lib/x86/librealm-jni.so
26643-26643/? I/DEBUG:     #02 pc 0009c299  /data/app/com.lockedout.app-1/lib/x86/librealm-jni.so
26643-26643/? I/DEBUG:     #03 pc 004002d3  /data/dalvik-cache/x86/data@app@com.lockedout.app-1@base.apk@classes.dex
26643-26643/? I/DEBUG:     #04 pc 00000002  <unknown>
26643-26643/? I/DEBUG: Tombstone written to: /data/tombstones/tombstone_06

更新

我在notifyDataSetChanged上调用RecyclerView.Adapter之后缩小了问题,但我的代码在执行后没有做任何其他事情。所以我将问题区域进一步缩小到android的Looper类中的第135行:

Message msg = queue.next(); // might block

我不确定这意味着什么,但我想有人知道Realm的内部结构可能能够在Looper中找出错误原因的原因。

有关错误发生前Realm内发生的更改的更多信息: 在notifyDataSetChanged又名“用户”的RealmChangeListener集内触发RealmObject。导致更改的交易从RealmObject的{​​{1}}删除了自定义User又名“项目”。我知道这是因为我的代码而发生的唯一事务和操作。以下是删除RealmList<Item>的代码:

Item

更新

导致错误的Realm代码的确切行是RealmSingleton.getUserInstance().executeTransaction(new Realm.Transaction() { @Override public void execute(Realm realm) { UserSingleton.getUser().deleteItem(mItem.getClassId()); } }); 中的第149行:

SharedGroup

1 个答案:

答案 0 :(得分:1)

(我仍然不是官方的Realm人员)

注意:为了真正回答这个问题,我必须查看完整的代码。毕竟,Realm在本机端处理大多数可能的崩溃并将其作为Java的一个例外,所以你可能做错了。 :P

<强>猜测:

1。)您在UI线程上使用异步查询和同步写入,因此creating detached row accessors that you then try to delete based on ID despite it not being its latest version

(异步查询不会立即执行,您需要使用RealmChangeListener监听它的完成情况,但是如果将它们与UI线程上的同步写入混合使用,则会强制查询变为同步。)

2。)你修改了一些后台线程,它还没有更新UI线程上的RealmResults(用looper运行事件处理),你尝试在事务中使用的元素不是最新,所以删除崩溃。

可能的解决方案:

a。)当您在UI线程上时,请使用executeTransactionAsync()代替executeTransaction()

b。)在你的方法中

UserSingleton.getUser().deleteItem(mItem.getClassId());

不确定UserSingleton是什么,但在删除元素之前,您应该考虑根据事务中的ID重新查找它以获取元素的最新版本(在这种特定情况下可能尚未更新) ,毕竟是UI线程上的同步事务)

可能的行动方案:

如果您想帮助Realm,如果此崩溃是可重现的,请考虑将项目发送到help[at]realm.io,以便他们可以查看并修复它。毕竟,您应该获得Java异常,而不是本机崩溃。