在 /dev/ashmem/dalvik-jit-code-cache 发生本地崩溃。

5

我收到来自许多设备的崩溃报告,这是我的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%

这是我能解决的问题吗?


可能是重复的问题:意外发生致命信号16(SIGSTKFLT) - Larry Schiefer
2个回答

5
Dalvik虚拟机在某些情况下会向自身抛出SIGSTKFLT信号。您可以在此处查看代码 here。其中一个调用站点是here。目标是从debuggerd中获得旋转线程的堆栈跟踪,以便在logcat输出中看到它。(这是Android现在具有的优美堆栈展开代码之前的事情,在改进展开器之前,Dalvik继续使用了这种有些粗糙的机制。)
您应该在崩溃上方看到一些诊断信息,指出有一个旋转线程——在logcat输出中向上滚动并查看您找到什么。
JIT代码缓存中的堆栈跟踪表明,在信号到达时,线程正在运行JIT编译的代码。换句话说,这是VM的错误。
您可能会看到bug 58726的实例,稍微讨论了一下这个问题。该错误的具体情况应该已经在4.4.2中得到修复,但可能存在其他类似故障的错误。基本问题是OEM增强程序出了问题……特别注意您在Google Nexus设备上没有看到任何故障。(我认为您列表中的所有设备都基于高通芯片,这会指向它们。再一次)
正如我在另一个问题的答案中所指出的那样,解决方法基本上是取消优化代码,以使其不会触发JIT中的错误路径。

在onPause中放置一段代码(假设在VM崩溃时不会被调用),保存应用程序没有崩溃并在下次启动时进行相应的调整,这样做是否是不好的实践? - Kieron
如果有两个代码路径带来了可衡量的好处,那么有一些检测问题并采取较慢路径的手段是有意义的。然而,从整体可靠性和可维护性的角度来看,让每个设备运行相同的代码会更好。Qcom在市场上占据很大份额,你肯定会得到一些误报,因此我不确定通过添加“上次是否崩溃”的逻辑能够获得多少收益。 - fadden

0

这个问题,或者类似的问题 Fatal signal 11 (SIGSEGV),在ARM模拟器上运行仪器单元测试时可能会发生,特别是在Android 4.1模拟器上。您还会在Logcat中看到以下消息:

Test failed to run to completion. Reason: Instrumentation run failed due to Process crashed. Check device logcat for details.

通常情况下,当测试在后台运行时,没有启动任何Activity,例如ActivityUnitTestCaseSingleLaunchActivityTestCase,就会出现这种情况。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接