Случайные сбои приложения с фатальным сигналом 7 (SIGBUS), кодом 2 или фатальным сигналом 11 (SIGSEGV), кодом 1

контекст

Я создаю приложение, которое должно показывать некоторые изображения во Fragment, большинство из которых загружаются из Интернета.

Я использую Glide для обработки загрузки изображений для меня на моих CardViews и Fresco на моем слайдере изображений (и этот вопрос на SO объясняет, почему я использую две библиотеки изображений).

Часть библиотеки Fresco в основном основана на этом форке AndroidImageSlider.

Важно: изображения, которые я пытаюсь загрузить, могут быть в PNG или SVG.

Больше информации: я использую Moto Maxx (международная версия Droid Turbo) под управлением Android 5.0.2. Также произошло на Samsung Galaxy S4 под управлением Android 4.4.2 (мод cyanogen), но это случается гораздо реже.

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)

РЕДАКТИРОВАТЬ: также произошло на Samsung Galaxy 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

Я видел в некоторых местах, что эта проблема может быть связана с нехваткой памяти. Но я думаю, что это маловероятно, так как мой телефон получил 3 ГБ или ОЗУ, и я загружаю меньше изображений по сравнению с родным приложением галереи (которое не падает на моем телефоне).

С другой стороны, тема в трекере проблем с skia предполагает, что она связана с библиотекой SVG.

Обновление: я нашел эту ссылку на трекере проблем Android, а эту - на трекере проблем skia, который, скорее всего, связан с этой проблемой.

Другое обновление: я удалил слайдер, и приложение перестало падать. Я думаю, что проблема там.

Еще одно обновление: я изменил ползунок для загрузки только PNG или только SVG в данный момент времени. Приложение зависало только при загрузке изображений SVG. Так что, возможно, проблема в SVG lib.

Загрузка SVG из файла также дает сбой.

Ответ 1

У меня не было бы действительно решения, но я полагаю, что у меня есть несколько полезных советов, чтобы помочь вам разобраться в проблеме, но это было довольно долго для комментария

Вы уже сузили вопрос. Проблема, скорее всего, на некоторых или на всех SVG.

Поэтому я бы сосредоточился на том, чтобы определить, являются ли все SVG или некоторые из них причиной этой проблемы.

Навигация по "SVG lib" коду, который вы упомянули, не выглядит так, что в нем есть какие-то нативные компоненты, поэтому я бы не стал винить это.

Проверка вашего следа совершенно ясно, что сбой происходит в собственной библиотеке "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)

Backtrace читается сверху вниз, поэтому первая строка, которую я разместил, - это то, что именно вылетело. Какая-то непрозрачная вещь без фильтра на что-то неоновое. (NEON находится на чипе процессора и либо устройство поддерживает его, либо нет)

Некоторые дополнительные подробности о библиотеке Skia:

Skia - это библиотека 2D-графики с открытым исходным кодом, которая предоставляет общие API-интерфейсы, которые работают на различных аппаратных и программных платформах. Он служит графическим движком для Google Chrome и Chrome OS, Android, Mozilla Firefox и Firefox OS и многих других продуктов.

Компания Skia спонсируется и управляется Google, но доступна для всех, кто пользуется лицензией BSD Free Software. Хотя разработка основных компонентов выполняется командой разработчиков Skia, мы учитываем вклад любого источника.

Таким образом, проблема, скорее всего, связана с "Исходным кодом Android" или ПЗУ, которые используются вашими устройствами тестирования. Вы тестировали приложение на ванильном андроиде, чтобы увидеть, по-прежнему ли оно вылетает? Или, по крайней мере, то, что не имеет какого-либо пользовательского ПЗУ, поскольку вы можете столкнуться с некоторыми ограничениями. Я сам сталкивался с некоторыми ограничениями в отношении пользовательских ПЗУ в отношении неоновых функций, но никогда в отношении ПЗУ OEM/Stock.

Наконец, что не менее важно, есть некоторые ограничения при загрузке SVG в Android, поэтому другая вероятность состоит в том, чтобы поразить один из них. Погуглил, я нашел статью, в которой упоминается, но не уверен, что она единственная.

Справочник разработчика Android рекомендует, чтобы векторное изображение было ограничено максимум 200 x 200 точек на дюйм, так как начальная загрузка векторной графики может быть относительно дорогой, что приводит к длительному времени рисования.