android - 应用程序随机崩溃,致命信号 7 (SIGBUS),代码 2 或致命信号 11 (SIGSEGV),代码 1

标签 android svg android-glide fresco

上下文

我正在创建一个应用程序,它应该在 Fragment 上显示一些图像,其中大部分是从 Internet 下载的。

我正在使用 Glide在我的 CardViews 和 Fresco 上为我处理该图像加载在我的图像 slider 上(this question on SO 解释了我为什么使用两个图像库)。

lib 的 Fresco 部分主要基于 this fork AndroidImageSlider.

重要提示:我尝试加载的图像可以是 PNGSVG

更多信息:我使用的是 Moto Maxx (Droid Turbo 的国际版)运行 Android 5.0.2。在运行 Android 4.4.2(氰模块)的三星 Galaxy S4 上也发生过这种情况,但发生的频率要低得多。

P.S.:使用 NDK。

问题

有时,我的应用程序会突然崩溃,甚至没有任何用户交互。当它发生时,我在 logcat 上收到以下错误消息:

Fatal signal 7 (SIGBUS), code 2, fault addr 0x9a74c060 in tid 21894

全栈:

04-07 07:59:08.110 21894 21894 F libc    : Fatal signal 7 (SIGBUS), code 2, fault addr 0x9a74c060 in tid 21894 (asus.saitestore)
04-07 07:59:08.161 21946 21946 E Diag_Lib:  Diag_LSM_Init: Failed to open handle to diag driver, error = 2
04-07 07:59:08.263   333   333 I DEBUG   : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
04-07 07:59:08.263   333   333 I DEBUG   : Build fingerprint: 'motorola/quark_retbr/quark_umts:5.0.2/LXG22.33-12.16/16:user/release-keys'
04-07 07:59:08.263   333   333 I DEBUG   : Revision: 'p4a0'
04-07 07:59:08.263   333   333 I DEBUG   : ABI: 'arm'
04-07 07:59:08.263   333   333 I DEBUG   : pid: 21894, tid: 21894, name: asus.saitestore  >>> org.unasus.saitestore <<<
04-07 07:59:08.264   333   333 I DEBUG   : signal 7 (SIGBUS), code 2 (BUS_ADRERR), fault addr 0x9a74c060
04-07 07:59:08.446   333   333 I DEBUG   :     r0 00000000  r1 bead50cc  r2 00000000  r3 9dae4000
04-07 07:59:08.446   333   333 I DEBUG   :     r4 9dae4000  r5 9a74c060  r6 bead50d4  r7 00000001
04-07 07:59:08.446   333   333 I DEBUG   :     r8 00063054  r9 00000000  sl 000000fe  fp 00000000
04-07 07:59:08.446   333   333 I DEBUG   :     ip 00000000  sp bead5094  lr b5952d63  pc b5a38426  cpsr 800b0030
04-07 07:59:08.447   333   333 I DEBUG   : 
04-07 07:59:08.447   333   333 I DEBUG   : backtrace:
04-07 07:59:08.447   333   333 I DEBUG   :     #00 pc 001b2426  /system/lib/libskia.so (S32_opaque_D32_nofilter_DX_neon(SkBitmapProcState const&, unsigned int const*, int, unsigned int*)+141)
04-07 07:59:08.447   333   333 I DEBUG   :     #01 pc 000ccd61  /system/lib/libskia.so (SkBitmapProcShader::BitmapProcShaderContext::shadeSpan(int, int, unsigned int*, int)+86)
04-07 07:59:08.447   333   333 I DEBUG   :     #02 pc 000d6cff  /system/lib/libskia.so (SkARGB32_Shader_Blitter::blitV(int, int, int, unsigned char)+528)
04-07 07:59:08.447   333   333 I DEBUG   :     #03 pc 001076c1  /system/lib/libskia.so
04-07 07:59:08.447   333   333 I DEBUG   :     #04 pc 0010782d  /system/lib/libskia.so
04-07 07:59:08.447   333   333 I DEBUG   :     #05 pc 001078b9  /system/lib/libskia.so
04-07 07:59:08.447   333   333 I DEBUG   :     #06 pc 00107cf3  /system/lib/libskia.so (SkScan::AntiFillRect(SkRect const&, SkRegion const*, SkBlitter*)+178)
04-07 07:59:08.447   333   333 I DEBUG   :     #07 pc 0010804b  /system/lib/libskia.so (SkScan::AntiFillRect(SkRect const&, SkRasterClip const&, SkBlitter*)+14)
04-07 07:59:08.447   333   333 I DEBUG   :     #08 pc 000e2031  /system/lib/libskia.so (SkDraw::drawRect(SkRect const&, SkPaint const&) const+252)
04-07 07:59:08.447   333   333 I DEBUG   :     #09 pc 000e3513  /system/lib/libskia.so (SkDraw::drawBitmap(SkBitmap const&, SkMatrix const&, SkPaint const&) const+276)
04-07 07:59:08.447   333   333 I DEBUG   :     #10 pc 000db7c5  /system/lib/libskia.so
04-07 07:59:08.447   333   333 I DEBUG   :     #11 pc 000db8ad  /system/lib/libskia.so (SkCanvas::drawBitmap(SkBitmap const&, float, float, SkPaint const*)+116)
04-07 07:59:08.447   333   333 I DEBUG   :     #12 pc 000f97bb  /system/lib/libskia.so (SkPicturePlayback::draw(SkCanvas&, SkDrawPictureCallback*)+1186)
04-07 07:59:08.447   333   333 I DEBUG   :     #13 pc 000b54c7  /system/framework/arm/boot.oat
04-07 07:59:09.190   333   333 I DEBUG   : Tombstone written to: /data/tombstones/tombstone_08
04-07 07:59:09.205   806   828 I BootReceiver: Copying /data/tombstones/tombstone_08 to DropBox (SYSTEM_TOMBSTONE)

曾经,它也给了我一个不同的错误信息:

Fatal signal 11 (SIGSEGV), code 1, fault addr 0x9abe300c in tid 30052

还有完整的堆栈:

04-04 15:41:34.059: A/libc(30052): Fatal signal 11 (SIGSEGV), code 1, fault addr 0x9abe300c in tid 30052 (asus.saitestore)
04-04 15:41:34.161: I/DEBUG(28994): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
04-04 15:41:34.161: I/DEBUG(28994): Build fingerprint: 'motorola/quark_retbr/quark_umts:5.0.2/LXG22.33-12.16/16:user/release-keys'
04-04 15:41:34.161: I/DEBUG(28994): Revision: 'p4a0'
04-04 15:41:34.161: I/DEBUG(28994): ABI: 'arm'
04-04 15:41:34.161: I/DEBUG(28994): pid: 30052, tid: 30052, name: asus.saitestore  >>> org.unasus.saitestore <<<
04-04 15:41:34.161: I/DEBUG(28994): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x9abe300c
04-04 15:41:34.177: I/DEBUG(28994):     r0 00000000  r1 bede70a4  r2 00000000  r3 9ce89000
04-04 15:41:34.178: I/DEBUG(28994):     r4 9ce89000  r5 9abe300c  r6 bede70ac  r7 00000001
04-04 15:41:34.178: I/DEBUG(28994):     r8 00000000  r9 00000000  sl 000000fe  fp 00000000
04-04 15:41:34.178: I/DEBUG(28994):     ip 00000000  sp bede706c  lr b5992d63  pc b5a78426  cpsr 800b0030
04-04 15:41:34.178: I/DEBUG(28994): backtrace:
04-04 15:41:34.178: I/DEBUG(28994):     #00 pc 001b2426  /system/lib/libskia.so (S32_opaque_D32_nofilter_DX_neon(SkBitmapProcState const&, unsigned int const*, int, unsigned int*)+141)
04-04 15:41:34.178: I/DEBUG(28994):     #01 pc 000ccd61  /system/lib/libskia.so (SkBitmapProcShader::BitmapProcShaderContext::shadeSpan(int, int, unsigned int*, int)+86)
04-04 15:41:34.178: I/DEBUG(28994):     #02 pc 000d6cff  /system/lib/libskia.so (SkARGB32_Shader_Blitter::blitV(int, int, int, unsigned char)+528)
04-04 15:41:34.178: I/DEBUG(28994):     #03 pc 0010721d  /system/lib/libskia.so
04-04 15:41:34.178: I/DEBUG(28994):     #04 pc 00107669  /system/lib/libskia.so
04-04 15:41:34.178: I/DEBUG(28994):     #05 pc 0010782d  /system/lib/libskia.so
04-04 15:41:34.178: I/DEBUG(28994):     #06 pc 001078b9  /system/lib/libskia.so
04-04 15:41:34.178: I/DEBUG(28994):     #07 pc 00107cf3  /system/lib/libskia.so (SkScan::AntiFillRect(SkRect const&, SkRegion const*, SkBlitter*)+178)
04-04 15:41:34.179: I/DEBUG(28994):     #08 pc 0010804b  /system/lib/libskia.so (SkScan::AntiFillRect(SkRect const&, SkRasterClip const&, SkBlitter*)+14)
04-04 15:41:34.179: I/DEBUG(28994):     #09 pc 000e2031  /system/lib/libskia.so (SkDraw::drawRect(SkRect const&, SkPaint const&) const+252)
04-04 15:41:34.179: I/DEBUG(28994):     #10 pc 000e3513  /system/lib/libskia.so (SkDraw::drawBitmap(SkBitmap const&, SkMatrix const&, SkPaint const&) const+276)
04-04 15:41:34.179: I/DEBUG(28994):     #11 pc 000db7c5  /system/lib/libskia.so
04-04 15:41:34.179: I/DEBUG(28994):     #12 pc 000db8ad  /system/lib/libskia.so (SkCanvas::drawBitmap(SkBitmap const&, float, float, SkPaint const*)+116)
04-04 15:41:34.179: I/DEBUG(28994):     #13 pc 000f97bb  /system/lib/libskia.so (SkPicturePlayback::draw(SkCanvas&, SkDrawPictureCallback*)+1186)
04-04 15:41:34.179: I/DEBUG(28994):     #14 pc 000b54c7  /system/framework/arm/boot.oat
04-04 15:41:34.820: I/DEBUG(28994): Tombstone written to: /data/tombstones/tombstone_07
04-04 15:41:34.821: I/BootReceiver(1989): Copying /data/tombstones/tombstone_07 to DropBox (SYSTEM_TOMBSTONE)

编辑: 也发生在三星 Galaxy S4 上,tombstone can be found here .

我如何加载图片

在我的 CardAdapter 中,我正在加载这样的图像(SVG 部分取自 here):

if (mod.getImg_type() == ImageTypes.SVG) {
    GenericRequestBuilder<Uri, InputStream, SVG, PictureDrawable> requestBuilder;

    SVGDecoder decoder = new SVGDecoder(PreserveAspectRatio.STRETCH);

    requestBuilder = Glide.with(mContext)
            .using(Glide.buildStreamModelLoader(Uri.class, mContext), InputStream.class)
            .from(Uri.class)
            .as(SVG.class)
            .transcode(new SvgDrawableTranscoder(), PictureDrawable.class)
            .sourceEncoder(new StreamEncoder())
            .cacheDecoder(new FileToStreamDecoder<>(decoder))
            .decoder(decoder)
            .placeholder(R.drawable.modulo)
            .error(R.drawable.banner_error)
            .animate(android.R.anim.fade_in)
            .listener(new SvgSoftwareLayerSetter<Uri>());

    requestBuilder
            .diskCacheStrategy(DiskCacheStrategy.SOURCE)
            .load(Uri.parse(mod.getUrl_icon()))
            .into(cardHolder.iv_card);
}
else {
    Glide.with(mContext)
            .load(mod.getUrl_icon())
            .placeholder(R.drawable.modulo)
            .error(R.drawable.banner_error)
            .centerCrop()
            .crossFade()
            .into(cardHolder.iv_card);
}

XML 文件如下所示:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/card_view"
    android:layout_width="@dimen/card_w"
    android:layout_height="@dimen/card_h"
    android:layout_margin="5dp"
    android:stateListAnimator="@anim/raise"
    card_view:cardCornerRadius="0dp"
    android:foreground="?android:attr/selectableItemBackground">

    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/rl_card">


        <ImageView
            android:layout_width="@dimen/card_image_w"
            android:layout_height="@dimen/card_image_h"
            android:layout_centerHorizontal="true"
            android:scaleType="fitXY"
            android:id="@+id/iv_card"
            android:src="@drawable/modulo"
            android:layout_margin="@dimen/spacing_medium" />

        <TextView
            android:id="@+id/tv_card"
            android:layout_width="@dimen/card_text_w"
            android:layout_height="@dimen/card_text_h"
            android:maxHeight="@dimen/card_text_h"
            android:maxWidth="@dimen/card_text_w"
            android:layout_below="@+id/iv_card"
            android:layout_centerHorizontal="true"
            android:ellipsize="end"
            android:maxLines="1"
            android:singleLine="true"
            android:text="Bacon ipsum dolor amet duis short ribs nostrud esse tempor."
            android:textSize="12sp"
            android:gravity="center_horizontal"
            android:layout_marginLeft="@dimen/spacing_medium"
            android:layout_marginRight="@dimen/spacing_medium" />

        <View
            android:id="@+id/card_check"
            android:layout_width="match_parent"
            android:layout_height="@dimen/card_check_h"
            android:maxHeight="@dimen/card_check_h"
            android:layout_below="@+id/tv_card"
            android:background="@color/primary_light"
            android:layout_alignParentBottom="true" />
    </RelativeLayout>

</android.support.v7.widget.CardView>

到目前为止我发现了什么

我在这里找到了一些关于 SO 的问题,但没有一个对我的问题有真正的帮助。而且复制起来有点困难。有时应用程序根本不会崩溃,即使在故障屏幕上 30 分钟后也是如此。另一方面,它发生在图像显示之后。

我发现的一些问题:

还有很多其他...

这是应用程序的屏幕截图,取 self 手机生成的错误报告:

screenshot

我在某些地方看到这个问题可能与内存不足有关。但我认为这不太可能,因为我的手机有 3GB 或 RAM,而且与 native 图库应用程序相比,我加载的图片更少(它不会在我的手机上崩溃)。

另一方面,skia 问题跟踪器上的线程表明它与 SVG 库有关。

更新:我找到了 this link在 Android 问题跟踪器上,以及 this one在skia问题跟踪器上,这很可能与问题有关。

其他更新:我移除了 slider ,应用停止崩溃。我想问题就在那里。

又一次更新:我已将 slider 更改为在给定时间内仅加载 PNG 或仅加载 SVG该应用仅在加载 SVG 图像 时崩溃。所以也许问题出在 SVG lib .

从文件加载 SVG 也会崩溃。

最佳答案

我并没有真正的解决方案,但我相信我有一些有用的提示可以帮助您进一步挖掘问题,但评论的时间很长

您已经缩小了问题范围。问题很可能出在部分或全部 SVG 上。

因此,我将重点确定是否所有 SVG 或其中一些都导致了该问题。

浏览您提到的“SVG lib”代码,它看起来没有任何 native 组件,所以我不会责怪它。

检查您的回溯很清楚,崩溃发生在“Skia” native 库 (libskia.so) 上。

在您的回溯的人类可读部分下方发布:

/system/lib/libskia.so (S32_opaque_D32_nofilter_DX_neon(SkBitmapProcState const&, unsigned int const*, int, unsigned int*)+141)
/system/lib/libskia.so (SkBitmapProcShader::BitmapProcShaderContext::shadeSpan(int, int, unsigned int*, int)+86)
/system/lib/libskia.so (SkARGB32_Shader_Blitter::blitV(int, int, int, unsigned char)+528)

/system/lib/libskia.so (SkScan::AntiFillRect(SkRect const&, SkRegion const*, SkBlitter*)+178)
/system/lib/libskia.so (SkScan::AntiFillRect(SkRect const&, SkRasterClip const&, SkBlitter*)+14)
/system/lib/libskia.so (SkDraw::drawRect(SkRect const&, SkPaint const&) const+252)
/system/lib/libskia.so (SkDraw::drawBitmap(SkBitmap const&, SkMatrix const&, SkPaint const&) const+276)

/system/lib/libskia.so (SkCanvas::drawBitmap(SkBitmap const&, float, float, SkPaint const*)+116)
/system/lib/libskia.so (SkPicturePlayback::draw(SkCanvas&, SkDrawPictureCallback*)+1186)

Backtrace 是从上到下读取的,所以我发布的第一行就是崩溃的内容。一些不透明的东西,没有过滤 NEON 。 (NEON 在处理器芯片上,设备支持与否)

关于 Skia library 的一些额外细节:

Skia is an open source 2D graphics library which provides common APIs that work across a variety of hardware and software platforms. It serves as the graphics engine for Google Chrome and Chrome OS, Android, Mozilla Firefox and Firefox OS, and many other products.

Skia is sponsored and managed by Google, but is available for use by anyone under the BSD Free Software License. While engineering of the core components is done by the Skia development team, we consider contributions from any source.

因此,问题很可能出在“Android 源代码”或您的测试设备使用的 ROM 上。您是否在 vanila android 上测试过该应用程序以查看它是否仍然崩溃?或者至少没有一些自定义 ROM 的东西,因为你可能会在那里遇到一些限制。我自己在关于 NEON 功能的自定义 ROM 上遇到了一些限制,但在 OEM/库存 ROM 上从来没有。

最后但并非最不重要的一点是,将 SVG 加载到 Android 时存在一些限制,因此另一种可能性是点击其中一个。谷歌搜索我发现了一个 article提到它,但不确定它是否是唯一的。

The Android Developer reference recommends that a vector image be limited to a maximum of 200 x 200 dpi, as the initial loading of a vector graphic can be relatively expensive, leading to long draw times.

关于android - 应用程序随机崩溃,致命信号 7 (SIGBUS),代码 2 或致命信号 11 (SIGSEGV),代码 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36507316/

相关文章:

java - 删除第三个正斜杠之前的所有内容

android - Firebase 测试实验室 - 从 CI 或命令行提供 Robo 脚本?

javascript - Safari 的 SVG SMIL 动画解决方法?

javascript - 动画字母很容易?

java - 使用Glide库加载图像以填满屏幕

android - Android/Ant 的自动化单元测试

java - 类未找到异常 : Didn't find class "clipper" on path: DexPathList - Android Studio

javascript - 如何使用 Javascript 获取完整的 Canvas 内容(甚至隐藏的内容)?

android - 图像在滑动缩放时失真

java - GridView 中使用 Glide 加载图像太慢