web-dev-qa-db-ja.com

致命的なシグナル7(SIGBUS)、コード2または致命的なシグナル11(SIGSEGV)、コード1でアプリがランダムにクラッシュする

コンテキスト

Fragmentにいくつかの画像を表示することになっているアプリを作成していますが、そのほとんどはインターネットからダウンロードされたものです。

CardViewsでの画像の読み込みを処理するために Glide を使用し、画像スライダーで Fresco を使用しています(そして SOに関するこの質問 理由を説明します私は2つの画像ライブラリを使用しています)。

LibのFresco部分は、ほとんどがAndroidImageSliderの-​​ このフォーク に基づいています。

重要:ロードしようとしている画像はPNGまたはSVGのいずれかです。

詳細:私は Moto Maxx (国際版の Droid Turbo )を使用しています実行中Android5.0.2。SamsungGalaxyS4実行中Android 4.4.2(cyanogen mod)でも発生しましたが、発生頻度ははるかに低いです。

PS:私は[〜#〜]ではありません[〜#〜]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)

編集:サムスンギャラクシーS4でも発生しました 墓石はここにあります

画像の読み込み方法

私のCardAdapterの中に、次のような画像をロードしています(SVG部分は ここ から取得されました):

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分経過しても、アプリがまったくクラッシュしない場合があります。一方、それは画像が表示された直後に起こりました。

私が見つけたいくつかの質問:

そして他の多くの...

そして、これが私の電話によって生成されたバグレポートから取られたアプリのスクリーンショットです:

screenshot

この問題がメモリ不足に関連している可能性があることをいくつかの場所で見ました。しかし、私の電話は3GBまたはRAMを搭載しており、ネイティブのギャラリーアプリ(電話でクラッシュしない)と比較してロードする画像が少ないため、それはありそうもないと思います。

一方、skia Issue Trackerのスレッドは、SVGライブラリに関連していることを示唆しています。

更新:私は このリンク Android Issue Tracker、および- これ skia Issue Trackerで、問題に関連している可能性が最も高いです。

その他の更新:スライダーを削除したところ、アプリのクラッシュが停止しました。問題はそこにあると思います。

さらに別の更新:指定された時間にPNGのみまたはSVGのみをロードするようにスライダーを変更しました。 アプリはSVG画像の読み込み中にのみクラッシュしました。したがって、おそらく問題は SVG lib にあります。

ファイルからSVGをロードすることもクラッシュします。

19
Mauker

私は本当に解決策を持っていませんが、問題をさらに掘り下げるのに役立ついくつかの役立つヒントがあると思いますが、コメントにはかなり長い時間がかかりました

あなたはすでに問題を絞り込んでいます。問題はおそらく一部またはすべてのSVGにあります。

したがって、すべてのSVGまたはそれらの一部がその問題を引き起こしているかどうかを特定することに焦点を当てます。

あなたが言及した「SVGlib」コードをナビゲートすると、ネイティブコンポーネントが含まれていないように見えるので、私はそれを非難しません。

バックトレースを確認すると、クラッシュが「Skia」ネイティブライブラリ(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)

バックトレースは上から下に読み取られるので、私が投稿した最初の行は正確にクラッシュしたものです。何かネオンにフィルターのない不透明なもの。 ( [〜#〜] neon [〜#〜] はプロセッサチップ上にあり、デバイスがそれをサポートしているかどうか)

Skiaライブラリ に関するいくつかの追加の詳細:

Skiaは、さまざまなハードウェアおよびソフトウェアプラットフォームで機能する共通のAPIを提供するオープンソースの2Dグラフィックライブラリです。これは、Google ChromeおよびChrome OS、Android、Mozilla Firefox、Firefox OS、およびその他の多くの製品のグラフィックエンジンとして機能します。

SkiaはGoogleによって後援および管理されていますが、BSDフリーソフトウェアライセンスの下で誰でも使用できます。コアコンポーネントのエンジニアリングはSkia開発チームによって行われますが、あらゆるソースからの貢献を考慮しています。

したがって、問題はおそらく「Androidソースコード」またはテストデバイスが使用するROMにあります。バニラAndroidでアプリケーションをテストして、それでもクラッシュするかどうかを確認しましたか?または、少なくともカスタムROMネオン機能に関するカスタムROMで自分自身にいくつかの制限に直面しましたが、OEM /ストックROMでは決してありませんでした。

大事なことを言い忘れましたが、SVGをAndroidにロードする際にはいくつかの制限があるため、別の可能性はそれらの1つにヒットすることです。グーグルで周りをグーグルで見つけました 記事 それについて言及していますが、それが唯一のものかどうかはわかりません。

Android開発者向けリファレンスでは、ベクターグラフィックの初期読み込みに比較的費用がかかり、描画時間が長くなる可能性があるため、ベクター画像を最大200 x 200dpiに制限することを推奨しています。

1
madlymad