Mysterious Signal 11 在访问 Room 数据库时崩溃

Mysterious Signal 11 crash when accessing Room database

关于

我有一个 android 应用程序,它有 2 个活动。 Activity A 生成 Activity B,Activity B 访问另一个模块中的房间数据库。我使用 Koin 进行所有依赖注入,并使用 rxandroid(Schedulers.io() 用于观察,UI 线程用于观察)观察数据库事务

问题

当我访问数据库时,操作成功完成,在数据库中添加了一个条目,然后 1-2 秒后 activity 崩溃并且应用程序 returns 到 Activity A 在应用程序中没有堆栈跟踪或任何错误消息 logcat。

我正在 AVD Pixel 2 中测试应用 API 28

如果我从 logcat 中删除所有过滤器,我会发现此错误:

2021-01-14 22:31:01.836 9799-9799/com.example.myapp I/System.out: Saving Course
2021-01-14 22:31:01.928 9799-9799/com.example.myapp I/System.out: Added course to DB: 11
2021-01-14 22:31:02.822 9799-9835/com.example.myapp I/om.example.myap: Explicit concurrent copying GC freed 94987(4MB) AllocSpace objects, 0(0B) LOS objects, 49% free, 3MB/6MB, paused 329us total 10.624ms
2021-01-14 22:31:03.439 1935-2006/? W/InputDispatcher: channel '7a68875 com.example.myapp/com.example.myapp.activities.CourseCreatorActivity (server)' ~ Consumer closed input channel or an error occurred.  events=0x9
2021-01-14 22:31:03.439 1935-2006/? E/InputDispatcher: channel '7a68875 com.example.myapp/com.example.myapp.activities.CourseCreatorActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
2021-01-14 22:31:03.441 1935-2006/? W/InputDispatcher: channel '1c99176 com.example.myapp/com.example.myapp.activities.MainActivity (server)' ~ Consumer closed input channel or an error occurred.  events=0x9
2021-01-14 22:31:03.441 1935-2006/? E/InputDispatcher: channel '1c99176 com.example.myapp/com.example.myapp.activities.MainActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
2021-01-14 22:31:03.443 1773-1773/? I/Zygote: Process 9799 exited due to signal (11)

信号 11 显然是分段错误..

我试过的

  1. 仅创建房间实体而不将其插入数据库仍然会导致崩溃
  2. 删除 Activity A 并在 Activity B 上启动应用程序(它访问数据库)似乎不会产生错误(我尝试了几十次)
  3. 使用调试器单步执行保存功能。我可以中断主线程或 IO 线程,在这两种情况下,尽管线程处于中断状态,应用程序仍会崩溃。
  4. 为 kotlin 协程替换 rxandroid。在此之后崩溃仍然发生
  5. 我已经尝试在我的 phone(像素 3a)上调试该应用程序,但到目前为止无法重现崩溃。不过会继续努力。
  6. 我在 API 30 的 Pixel 3a AVD 上试过这个,但无法重现崩溃。然后我在 API 28 尝试了 Pixel 3a AVD,然后崩溃就在那里。所以目前它似乎只发生在 API 28...
  7. 使用 API 27 和 API 29 进行测试,两者都工作正常。删除 API 28 SDK 并重新下载它,删除所有相关的 AVD 并重新创建它们,仍然收到信号 11 崩溃,就像第二次尝试全新安装 API 28 一样。所以看起来分段错误只发生在 Android Pie
  8. 我开始创建我在这里使用的相同整体架构和逻辑的简化版本,以努力查明错误的确切来源。我不太热衷于重新开始简化的项目,因为不知道是什么导致了这个错误,我很可能最终会 运行 再次进入它。

注意:有时我会进行更改,它会“修复”问题,只是一段时间后它会重新出现,这使得使用传统方法很难调试

结论

我真正需要的是一些调试方法。我不知道是什么原因造成的,也不知道如何继续调试它。

我换到了不同的 android API 级别,自从

之后问题没有再出现

由于字符数限制不得不 post 作为答案

因为我在两个不同的 EMU(28 和 30)上遇到了同样的事情,所以要解决这个问题。经过两周的调试,我遇到了这个问题。我觉得我的应用程序很简单。

核心组成Dagger2 RxJava2、Room、Retrofit、Material等

Main Activity A 包含 5 个集合片段,3 个是 liveData。 - 很好。

移至 Class B,好的,从数据库中获取对象列表。 - 很好

移动到 Class C,即时崩溃 - 7 秒。这是一个类似的设置,Class C,包含观察不同 LiveData 的片段。

没有错误,没有调试 - 只是调试器断开连接,logcat 中没有任何内容,除了上面的内容。墓碑上什么都没有。刚关闭频道 + I/Zygote: Process xxxx exited due to signal (11)

该应用程序将始终启动之前的 activity 或没有数据库数据的相同 activity。

启动了 leakcanry,什么也没有,启动了 Google vitals,什么也没有,启动了 Firebase crashlytics,但仍然没有。甚至启动了气刹,仍然没有。

切换到 Class D,它与 class C 非常相似,但跳过了 Class B,- 仍然崩溃。

切换到Class E,没有实时数据但直接保存到数据库,在那里崩溃。

我已经执行了通常的无效缓存并重新启动,擦除 EMU 上的数据...更多的调试尝试...快进两周,我遇到了这个,它让我不必撕掉房间。

解法: 我必须创建所有新的 EMU。现在完全相同的代码在 Android 23 到 30 之间工作。