我的应用程序没有使用NDK。我正在GenyMotion Nexus 7模拟器上测试它,问题很难复现,我还没有找到正确的复现方法。有时应用程序可以长时间正常工作,有时在使用约30秒后就会崩溃并自动重启。
编辑:我不确定但似乎只在Genymotion模拟器上发生,而不是普通的Android模拟器(我将继续测试)。
当横屏时支持大屏幕(同时显示两个片段,在小于720的宽度下仅显示1个片段)后,问题开始出现。
其中一个片段懒加载图像(从内存、磁盘或互联网中获取)。
我对这种动态添加和删除片段还很陌生,所以肯定存在问题。
请帮助我解码这个dump并找出导致崩溃的原因(我会尝试省略我认为不重要的内容):
12-17 16:52:18.344 1255-1255/? A/libc﹕ Fatal signal 11 (SIGSEGV) at 0x97858094 (code=2), thread 1255 (hiexpressgradle)
12-17 16:52:18.448 121-121/? I/DEBUG﹕ *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
12-17 16:52:18.448 121-121/? I/DEBUG﹕ Build fingerprint: 'generic/vbox86tp/vbox86tp:4.3/JLS36G/eng.buildbot.20131127.101043:userdebug/test-keys'
12-17 16:52:18.448 121-121/? I/DEBUG﹕ Revision: '0'
12-17 16:52:18.448 121-121/? I/DEBUG﹕ pid: 1255, tid: 1255, name: hiexpressgradle >>> XXX <<<
12-17 16:52:18.448 121-121/? I/DEBUG﹕ signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 97858094
12-17 16:52:18.608 121-121/? I/DEBUG﹕ eax 00000000 ebx b754a6fc ecx 0000000e edx 978580a2
12-17 16:52:18.608 121-121/? I/DEBUG﹕ esi 0000000c edi 00000001
12-17 16:52:18.608 121-121/? I/DEBUG﹕ xcs 00000073 xds 0000007b xes 0000007b xfs 00000000 xss 0000007b
12-17 16:52:18.608 121-121/? I/DEBUG﹕ eip b754a6fc ebp b94985e8 esp bfe29398 flags 00210292
12-17 16:52:18.608 121-121/? E/Corkscrew﹕ unrecognized DW_CFA_* instruction: 0x10
12-17 16:52:18.608 121-121/? I/DEBUG﹕ backtrace:
12-17 16:52:18.608 121-121/? I/DEBUG﹕ #00 pc 0002f6fc /system/lib/libc.so (memset+140)
12-17 16:52:18.608 121-121/? I/DEBUG﹕ #01 pc 00015c6f /system/lib/libhwui.so (android::uirenderer::FontRenderer::cacheBitmap(SkGlyph const&, android::uirenderer::CachedGlyphInfo*, unsigned int*, unsigned int*, bool)+511)
12-17 16:52:18.608 121-121/? I/DEBUG﹕ #02 pc 00011aea /system/lib/libhwui.so (android::uirenderer::Font::precache(SkPaint*, char const*, int)+922)
12-17 16:52:18.608 121-121/? I/DEBUG﹕ #03 pc 0001414e /system/lib/libhwui.so (android::uirenderer::FontRenderer::precache(SkPaint*, char const*, int, android::uirenderer::Matrix4 const&)+78)
12-17 16:52:18.608 121-121/? I/DEBUG﹕ #04 pc 00024aa6 /system/lib/libhwui.so (android::uirenderer::DrawTextOp::onDefer(android::uirenderer::OpenGLRenderer&, int*, void**)+486)
12-17 16:52:18.608 121-121/? I/DEBUG﹕ stack:
12-17 16:52:18.608 121-121/? I/DEBUG﹕ bfe29358 00000000
12-17 16:52:18.608 121-121/? I/DEBUG﹕ bfe2935c 00000000
12-17 16:52:18.608 121-121/? I/DEBUG﹕ bfe29360 00000000
12-17 16:52:18.608 121-121/? I/DEBUG﹕ bfe29364 00000000
12-17 16:52:18.608 121-121/? I/DEBUG﹕ bfe29368 00000000
12-17 16:52:18.608 121-121/? I/DEBUG﹕ bfe2936c 00000000
12-17 16:52:18.608 121-121/? I/DEBUG﹕ bfe29370 00000000
12-17 16:52:18.608 121-121/? I/DEBUG﹕ bfe29374 00000000
12-17 16:52:18.608 121-121/? I/DEBUG﹕ bfe29378 00000000
12-17 16:52:18.608 121-121/? I/DEBUG﹕ bfe2937c 00000000
12-17 16:52:18.608 121-121/? I/DEBUG﹕ bfe29380 00000000
12-17 16:52:18.608 121-121/? I/DEBUG﹕ bfe29384 00000000
12-17 16:52:18.608 121-121/? I/DEBUG﹕ bfe29388 00000000
12-17 16:52:18.608 121-121/? I/DEBUG﹕ bfe2938c 00000000
12-17 16:52:18.608 121-121/? I/DEBUG﹕ bfe29390 00000000
12-17 16:52:18.608 121-121/? I/DEBUG﹕ bfe29394 00000000
12-17 16:52:18.608 121-121/? I/DEBUG﹕ #00 bfe29398 b5ba5aac /system/lib/libhwui.so
12-17 16:52:18.608 121-121/? I/DEBUG﹕ bfe2939c b5b3ec70 /system/lib/libhwui.so (android::uirenderer::FontRenderer::cacheBitmap(SkGlyph const&, android::uirenderer::CachedGlyphInfo*, unsigned int*, unsigned int*, bool)+512)
12-17 16:52:18.608 121-121/? I/DEBUG﹕ #01 bfe293a0 97858094
12-17 16:52:18.608 121-121/? I/DEBUG﹕ bfe293a4 00000000
12-17 16:52:18.608 121-121/? I/DEBUG﹕ bfe293a8 0000000e
12-17 16:52:18.608 121-121/? I/DEBUG﹕ bfe293ac bfe2940c [stack]
12-17 16:52:18.608 121-121/? I/DEBUG﹕ bfe293b0 b9726ae4 [heap]
12-17 16:52:18.608 121-121/? I/DEBUG﹕ bfe293b4 00000000
12-17 16:52:18.608 121-121/? I/DEBUG﹕ bfe293b8 b934c340 [heap]
12-17 16:52:18.608 121-121/? I/DEBUG﹕ bfe293bc b6bff210 /system/lib/libskia.so (SkGlyphCache::findImage(SkGlyph const&)+144)
12-17 16:52:18.608 121-121/? I/DEBUG﹕ bfe293c0 b972f550 [heap]
12-17 16:52:18.608 121-121/? I/DEBUG﹕ bfe293c4 b934b588 [heap]
12-17 16:52:18.608 121-121/? I/DEBUG﹕ bfe293c8 00000000
12-17 16:52:18.608 121-121/? I/DEBUG﹕ bfe293cc 00000032
12-17 16:52:18.608 121-121/? I/DEBUG﹕ bfe293d0 bfe29410 [stack]
12-17 16:52:18.608 121-121/? I/DEBUG﹕ bfe293d4 bfe2940c [stack]
12-17 16:52:18.608 121-121/? I/DEBUG﹕ bfe293d8 97858008
12-17 16:52:18.608 121-121/? I/DEBUG﹕ bfe293dc b6eb8d48 /system/lib/libskia.so
12-17 16:52:18.608 121-121/? I/DEBUG﹕ ........ ........
12-17 16:52:18.608 121-121/? I/DEBUG﹕ #02 bfe29430 b94985e8 [heap]
12-17 16:52:18.608 121-121/? I/DEBUG﹕ bfe29434 b9726ae4 [heap]
12-17 16:52:18.608 121-121/? I/DEBUG﹕ bfe29438 b966b9c8 [heap]
12-17 16:52:18.608 121-121/? I/DEBUG﹕ bfe2943c bfe29470 [stack]
12-17 16:52:18.608 121-121/? I/DEBUG﹕ bfe29440 bfe29474 [stack]
12-17 16:52:18.608 121-121/? I/DEBUG﹕ bfe29444 00000001
12-17 16:52:18.608 121-121/? I/DEBUG﹕ bfe29448 00000000
12-17 16:52:18.608 121-121/? I/DEBUG﹕ bfe2944c 00000000
12-17 16:52:18.608 121-121/? I/DEBUG﹕ bfe29450 3f800000
12-17 16:52:18.608 121-121/? I/DEBUG﹕ bfe29454 00000010
12-17 16:52:18.608 121-121/? I/DEBUG﹕ bfe29458 b966b9c8 [heap]
12-17 16:52:18.608 121-121/? I/DEBUG﹕ bfe2945c b9670dc6 [heap]
12-17 16:52:18.608 121-121/? I/DEBUG﹕ bfe29460 b94907a4 [heap]
12-17 16:52:18.608 121-121/? I/DEBUG﹕ bfe29464 b9670e28 [heap]
12-17 16:52:18.608 121-121/? I/DEBUG﹕ bfe29468 3f800026
12-17 16:52:18.608 121-121/? I/DEBUG﹕ bfe2946c 00000000
12-17 16:52:18.608 121-121/? I/DEBUG﹕ ........ ........
12-17 16:52:18.608 121-121/? I/DEBUG﹕ memory map around fault addr 97858094:
12-17 16:52:18.608 121-121/? I/DEBUG﹕ 977fa000-97858000 r-x /dev/ashmem/dalvik-jit-code-cache (deleted)
12-17 16:52:18.608 121-121/? I/DEBUG﹕ 97858000-97859000 r-x
12-17 16:52:18.608 121-121/? I/DEBUG﹕ 97859000-978d9000 rw-
感谢@Simon的反馈,经过一些测试,我在安卓模拟器上也开始出现了错误。但是在安卓模拟器上,它是一个老掉牙的OutOfMemory异常。所以事实证明,我的可绘制管理器(在其中一个片段上)存在着巨大的内存泄漏,在这个管理器中,它会用可绘制对象填充一个HashMap 。只有当我实现了双面布局时,这才成为了一个问题,因为DrawableManager始终会保留在内存中(因为持有该管理器的类别选择片段永远不会重新创建),即使我切换类别也是如此。
编辑:尽管我已经解决了内存泄漏问题,我的genymotion模拟器仍然崩溃并显示相同的SIGSEGV错误,所以我想这个问题仍然是开放的。