Случайные сбои приложения с фатальным сигналом 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 точек на дюйм, так как начальная загрузка векторной графики может быть относительно дорогой, что приводит к длительному времени рисования.