【问题标题】:Native crash at /dev/ashmem/dalvik-jit-code-cache/dev/ashmem/dalvik-jit-code-cache 的本机崩溃
【发布时间】:2019-01-18 00:22:17
【问题描述】:

由于我的 Android 游戏 GeoGuess (https://play.google.com/store/apps/details?id=uk.co.quinny898.game.geoguess) 发生本机崩溃,我的许多设备都崩溃了

都是 Java,所以我不明白为什么会发生这种崩溃。崩溃发生在 34 个独特的设备上(并且还在增加),并且确实给用户带来了问题(它似乎正在启动)

堆栈跟踪如下:

*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Build fingerprint: 'samsung/serranoltexx/serranolte:4.4.2/KOT49H/I9195XXUCNH5:user/release-keys'
Revision: '5'
pid: 23657, tid: 23704, name: AsyncTask #1 >>> uk.co.quinny898.game.geoguess <<<
signal 16 (SIGSTKFLT), code -6 (SI_TKILL), fault addr --------
r0 42049ee8 r1 00000000 r2 663c69c3 r3 00000000
r4 622a880e r5 64489e8c r6 6447ca98 r7 000020f4
r8 417bbf80 r9 622a8806 sl 00000000 fp 42b5f278
ip 65c49fec sp 64861c40 lr 00000000 pc 663c69d8 cpsr 600d0030
d0 0000000000000000 d1 0000000000000000
d2 0000000000000000 d3 0000000000000000
d4 0000000000000000 d5 0000000000000000
d6 0000000000000000 d7 4140000000000000
d8 0000000000000000 d9 0000000000000000
d10 0000000000000000 d11 0000000000000000
d12 0000000000000000 d13 0000000000000000
d14 0000000000000000 d15 0000000000000000
d16 6c2f6176616a4c5b d17 64696f562f676e61
d18 577fd198577fd160 d19 577fd208577fd1d0
d20 577fd278577fd240 d21 579b81c0577fd2b0
d22 579b8230579b81f8 d23 579b82a0579b8268
d24 be5777a5d80dadae d25 3cc135bdbf311355
d26 3cc135bdbd16946f d27 3cc135bdb6c717bc
d28 3ff0000000000000 d29 bef375cbdb605373
d30 be48c28772093484 d31 3fd5555555555563
scr 20000010

backtrace:
#00 pc 0000e9d8 /dev/ashmem/dalvik-jit-code-cache (deleted)

code around pc:
663c69b8 5897607c 65ce796c f85f0048 68010008 
663c69c8 60013101 68a86829 f8d0b120 29001140 
663c69d8 e001d0fa e0026029 e0056029 f8dfde00 
663c69e8 6ef1003c 1c2d4788 4300e000 47806e70 
663c69f8 622a8816 4300e000 47806e70 622a87b4 
663c6a08 00000001 00000001 00000000 57be7128 
663c6a18 002d0102 00000001 00000000 622a880e 
663c6a28 65ce7970 f85f0030 68010008 60013101 
663c6a38 68696928 f2c04288 1c2d8007 4300e000 
663c6a48 47806e70 638d5004 f950e000 47806e70 
663c6a58 638d5010 00000002 00000000 00000000 
663c6a68 57c2e1f0 000a0101 00000001 00000000 
663c6a78 65ce7974 f85f00bc 68010008 60013101 
663c6a88 10fcf8df b1386828 f8df6800 428820f0 
663c6a98 8002f000 b3984790 f8df6829 b39120d0 
663c6aa8 429a680b 8009f040 8000f8d5 4008f8d8 

code around lr:
00000000 ffffffff ffffffff ffffffff ffffffff 
00000010 ffffffff ffffffff ffffffff ffffffff 
00000020 ffffffff ffffffff ffffffff ffffffff 
00000030 ffffffff ffffffff ffffffff ffffffff 
00000040 ffffffff ffffffff ffffffff ffffffff 
00000050 ffffffff ffffffff ffffffff ffffffff 
00000060 ffffffff ffffffff ffffffff ffffffff 
00000070 ffffffff ffffffff ffffffff ffffffff 
00000080 ffffffff ffffffff ffffffff ffffffff 
00000090 ffffffff ffffffff ffffffff ffffffff 
000000a0 ffffffff ffffffff ffffffff ffffffff 
000000b0 ffffffff ffffffff ffffffff ffffffff 
000000c0 ffffffff ffffffff ffffffff ffffffff 
000000d0 ffffffff ffffffff ffffffff ffffffff 
000000e0 ffffffff ffffffff ffffffff ffffffff 
000000f0 ffffffff ffffffff ffffffff ffffffff 

虽然位置和指纹变化明显。

也不限于Android版本,在4.3和4.4都有报道

上报的设备如下:

Xperia SP (C5303)   2   2.2%
LG Optimus L9 II (l9ii) 1   1.1%
Galaxy S3 (d2vmu)   1   1.1%
Galaxy S4 Mini (serranoltebmc)  2   2.2%
Galaxy S4 Active (jactivelteatt)    1   1.1%
Moto X (ghost)  6   6.6%
Droid Ultra (obake) 1   1.1%
Galaxy S3 (d2att)   1   1.1%
LG Optimus G (geehrc)   1   1.1%
Galaxy S4 Mini (serrano3g)  1   1.1%
Droid Mini (obakem) 1   1.1%
HTC One mini (htc_m4)   1   1.1%
Galaxy Express2 (wilcoxlte) 1   1.1%
Galaxy S4 (jfltespr)    1   1.1%
Galaxy S4 Mini (serranolte) 9   9.9%
Galaxy S4 (ks01lte) 2   2.2%
Galaxy S3 (d2vzw)   1   1.1%
Galaxy S4 (jfltevzw)    9   9.9%
Galaxy S4 (jfltecan)    1   1.1%
Galaxy S3 (d2usc)   1   1.1%
Galaxy S4 (jflteatt)    7   7.7%
Galaxy S4 Mini (serranoltevzw)  3   3.3%
HTC One (m7)    6   6.6%
Galaxy S3 (d2spr)   2   2.2%
Galaxy Note3 (hltecan)  1   1.1%
Xperia Z (C6603)    8   8.8%
Galaxy S4 Mini (serranolteusc)  3   3.3%
Galaxy Tab3 7.0 (lt02ltespr)    1   1.1%
Galaxy Note3 (hltevzw)  3   3.3%
Galaxy S4 (jflte)   6   6.6%
DROID RAZR M (scorpion_mini)    1   1.1%
Xperia Tablet Z (SGP321)    1   1.1%
Galaxy S4 (jflterefreshspr) 3   3.3%
Galaxy S4 (jfltetmo)    2   2.2%

这是我能解决的问题吗?

【问题讨论】:

标签: android dalvik


【解决方案1】:

Dalvik VM 在某些情况下会向自身抛出 SIGSTKFLT。你可以看到代码here。一个这样的呼叫站点是here。目标是从 debuggerd 的旋转线程中获取堆栈跟踪,以便您可以在 logcat 输出中看到它。 (这早于 Android 现在拥有的漂亮的堆栈展开代码,并且 Dalvik 在改进展开器之前进入了低维护模式,因此它继续使用这种有点粗糙的机制。)

您应该会在崩溃上方看到一些关于旋转线程的诊断信息——在 logcat 输出中向上滚动,看看您发现了什么。

JIT 代码缓存中的堆栈跟踪表明在信号到达时线程正在运行 JIT 编译的代码。换句话说,这是一个 VM 错误。

您可能会看到bug 58726 的一个实例,讨论了一点in this question。该错误的具体情况本应由 4.4.2 修复,但可能存在具有相似故障特征的不同错误。基本问题是 OEM 增强功能出错了……请特别注意,您在 Google Nexus 库存设备上没有看到任何故障。 (我认为您列表中的所有设备都基于高通芯片,这将指向它们。再次。)

正如我在对另一个问题的回答中所指出的,解决方法本质上是取消优化您的代码,这样它就不会在 JIT 中遇到错误的路径。

【讨论】:

  • 在 onPause 中有一段代码(假设在 VM 崩溃时不调用它)保存应用程序没有崩溃并在下一次崩溃时进行相应调整,这是一种不好的做法吗?开始?
  • 如果有两个代码路径有明显的好处,那么有一些方法来检测问题并采用较慢的路径是有意义的。但是,从整体可靠性和可维护性的角度来看,最好让每台设备运行相同的代码。 Qcom 拥有很大的市场份额,你肯定会得到一些误报,所以我不清楚通过添加“我上次崩溃了吗”逻辑你会获得这么多。
【解决方案2】:

在 ARM 仿真器(尤其是 Android 4.1 仿真器)上运行 Instrumentation 单元测试时,可能会出现此问题或与 Fatal signal 11 (SIGSEGV) 类似的问题。您还将在 Logcat 中看到此消息:

测试未能完成。原因:由于进程崩溃,检测运行失败。检查设备 logcat 以获取详细信息。

这通常发生在测试在后台运行且没有启动 Activity 时,例如 ActivityUnitTestCaseSingleLaunchActivityTestCase

解决方法是在这些测试运行时启动一个 Activity,最好将它们重写为使用ActivityTestRule

【讨论】:

    猜你喜欢
    • 2011-11-24
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多