Я читал другие посты по отслеживанию причин для получения SIGSEGV
в приложении для Android. Я планирую просмотреть свое приложение на предмет возможных NullPointers, связанных с использованием Canvas, но SIGSEGV
каждый раз у меня появляется новый адрес памяти. Плюс я видел code=1
и code=2
. Если адрес памяти был0x00000000
, я бы понял, что это NullPointer.
Последний, который я получил, был code=2
:
A/libc(4969): Fatal signal 11 (SIGSEGV) at 0x42a637d9 (code=2)
Любые предложения о том, как отследить это?
У меня есть подозреваемый, но я пока не заинтересован в экспериментах с ним. Мое приложение использует OSMDroid API для отображения в автономном режиме. Класс OverlayItem представляет маркеры / узлы на карте. У меня есть служба, которая собирает данные через сеть для заполнения OverlayItem, которые затем отображаются на карте. Чтобы упростить мой дизайн, я расширил OverlayItem в свой собственный класс NodeOverlayItem, который включает некоторые дополнительные атрибуты, которые я использую в UI Activity и в Service. Это дало мне один пункт информации об элементе для пользовательского интерфейса и службы. Я использовал Intents для трансляции в Activity, чтобы обновить карту пользовательского интерфейса, когда что-то изменилось. Activity связывается со службой, и есть метод Service, чтобы получить список объектов NodeOverlayItem. Я думаю, что это может быть использование API-интерфейса OSMDroid OverlayItem, и мой Сервис обновляет информацию об узле одновременно. (проблема параллелизма)
Когда я пишу это, я думаю, что это действительно проблема. Головная боль не отделяет Node и OverlayItem от NodeOverlayItem, это то, что Activity потребуются некоторые данные из Node, которые содержит Сервис. Кроме того, при создании действия (onResume и т. Д.) Необходимо будет заново создать объекты OverlayItem из данных узла, которые служба поддерживала, пока действие отсутствовало. Например, вы запускаете приложение, Служба собирает данные, пользовательский интерфейс отображает их, вы переходите в «Домой», а затем обратно в приложение, «Деятельности» нужно будет извлечь и заново создать OverlayItem из последних данных узла Службы.
Я знаю, что это не великие или ясные вопросы. Как будто все мои ТАК вопросы нишевые или неясные. Если у кого-то есть предложение о том, как интерпретировать эти SIGSEGV
ошибки, это будет с благодарностью!
ОБНОВЛЕНИЕ Вот последний сбой, зафиксированный во время сеанса отладки. У меня есть 3 из этих устройств, используемых для тестирования, и они не все надежно дают сбой при разработке и тестировании. Я добавил немного больше, чтобы можно было заметить регистрацию GC. Вы можете видеть, что проблема, вероятно, не связана с исчерпанием памяти.
03-03 02:02:38.328: I/CommService(7477): Received packet from: 192.168.1.102
03-03 02:02:38.328: I/CommService(7477): Already processed this packet. It's a re-broadcast from another node, or from myself. It's not a repeat broadcast though.
03-03 02:02:38.406: D/CommService(7477): Checking OLSRd info...
03-03 02:02:38.460: D/CommService(7477): Monitoring nodes...
03-03 02:02:38.515: D/dalvikvm(7477): GC_CONCURRENT freed 2050K, 16% free 17151K/20359K, paused 3ms+6ms
03-03 02:02:38.515: I/CommService(7477): Received packet from: 192.168.1.102
03-03 02:02:38.515: D/CommService(7477): Forwarding packet (4f68802cf10684a83ac4936ebb3c934d) along to other nodes.
03-03 02:02:38.609: I/CommService(7477): Received packet from: 192.168.1.100
03-03 02:02:38.609: D/CommService(7477): Forwarding packet (e4bc81e91ec92d06f83e03068f52ab4) along to other nodes.
03-03 02:02:38.609: D/CommService(7477): Already processed this packet: 4204a5b27745ffe5e4f8458e227044bf
03-03 02:02:38.609: A/libc(7477): Fatal signal 11 (SIGSEGV) at 0x68f52abc (code=1)
03-03 02:02:38.914: I/DEBUG(4008): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
03-03 02:02:38.914: I/DEBUG(4008): Build fingerprint: 'Lenovo/IdeaTab_A1107/A1107:4.0.4/MR1/eng.user.20120719.150703:user/release-keys'
03-03 02:02:38.914: I/DEBUG(4008): pid: 7477, tid: 7712 >>> com.test.testm <<<
03-03 02:02:38.914: I/DEBUG(4008): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 68f52abc
03-03 02:02:38.914: I/DEBUG(4008): r0 68f52ab4 r1 412ef268 r2 4d9c3bf4 r3 412ef268
03-03 02:02:38.914: I/DEBUG(4008): r4 001ad8f8 r5 4d9c3bf4 r6 412ef268 r7 4c479df8
03-03 02:02:38.914: I/DEBUG(4008): r8 4d9c3c0c r9 4c479dec 10 46cf260a fp 4d9c3c24
03-03 02:02:38.914: I/DEBUG(4008): ip 40262a04 sp 4d9c3bc8 lr 402d01dd pc 402d0182 cpsr 00000030
03-03 02:02:38.914: I/DEBUG(4008): d0 00000001000c0102 d1 3a22364574614c7d
03-03 02:02:38.914: I/DEBUG(4008): d2 403fc0000000007d d3 363737343433350a
03-03 02:02:38.914: I/DEBUG(4008): d4 49544341223a2273 d5 6f6567222c224556
03-03 02:02:38.914: I/DEBUG(4008): d6 3a223645676e6f4c d7 000000013835372d
03-03 02:02:38.914: I/DEBUG(4008): d8 0000000000000000 d9 4040000000000000
03-03 02:02:38.914: I/DEBUG(4008): d10 0000000000000000 d11 4040000000000000
03-03 02:02:38.914: I/DEBUG(4008): d12 4040000000000000 d13 0000000000000021
03-03 02:02:38.914: I/DEBUG(4008): d14 0000000000000000 d15 0000000000000000
03-03 02:02:38.914: I/DEBUG(4008): d16 3fe62e42fefa39ef d17 3ff0000000000000
03-03 02:02:38.914: I/DEBUG(4008): d18 3fe62e42fee00000 d19 0000000000000000
03-03 02:02:38.914: I/DEBUG(4008): d20 0000000000000000 d21 3ff0000000000000
03-03 02:02:38.914: I/DEBUG(4008): d22 4028000000000000 d23 3ff0000000000000
03-03 02:02:38.914: I/DEBUG(4008): d24 0000000000000000 d25 3ff0000000000000
03-03 02:02:38.914: I/DEBUG(4008): d26 0000000000000000 d27 c028000000000000
03-03 02:02:38.914: I/DEBUG(4008): d28 0000000000000000 d29 3ff0000000000000
03-03 02:02:38.914: I/DEBUG(4008): d30 3ff0000000000000 d31 3fecccccb5c28f6e
03-03 02:02:38.914: I/DEBUG(4008): scr 60000013
03-03 02:02:39.046: I/DEBUG(4008): #00 pc 0006b182 /system/lib/libcrypto.so (EVP_DigestFinal_ex)
03-03 02:02:39.046: I/DEBUG(4008): #01 pc 0006b1d8 /system/lib/libcrypto.so (EVP_DigestFinal)
03-03 02:02:39.054: I/DEBUG(4008): #02 pc 0001f814 /system/lib/libnativehelper.so
03-03 02:02:39.054: I/DEBUG(4008): #03 pc 0001ec30 /system/lib/libdvm.so (dvmPlatformInvoke)
03-03 02:02:39.054: I/DEBUG(4008): #04 pc 00058c70 /system/lib/libdvm.so (_Z16dvmCallJNIMethodPKjP6JValuePK6MethodP6Thread)
03-03 02:02:39.054: I/DEBUG(4008): code around pc:
03-03 02:02:39.054: I/DEBUG(4008): 402d0160 0003151e 4604b570 f7ff460d 4620ff81 ....p..F.F.... F
03-03 02:02:39.054: I/DEBUG(4008): 402d0170 f7ff4629 bd70ff93 4604b570 460e6800 )F....p.p..F.h.F
03-03 02:02:39.054: I/DEBUG(4008): 402d0180 68834615 dd062b40 21fa4810 44784a10 .F.h@+...H.!.JxD
03-03 02:02:39.054: I/DEBUG(4008): 402d0190 f7c8447a 6821f80f 698a4620 47904631 zD....!h F.i1F.G
03-03 02:02:39.054: I/DEBUG(4008): 402d01a0 b1154606 68836820 6822602b b12b6a13 .F.. h.h+`"h.j+.
03-03 02:02:39.054: I/DEBUG(4008): code around lr:
03-03 02:02:39.054: I/DEBUG(4008): 402d01bc 68e06821 21006c4a ea0af7c4 bd704630 !h.hJl.!....0Fp.
03-03 02:02:39.054: I/DEBUG(4008): 402d01cc 00031492 000314b5 4604b570 ffcef7ff ........p..F....
03-03 02:02:39.054: I/DEBUG(4008): 402d01dc 46204605 ff12f7ff bd704628 4604b573 .F F....(Fp.s..F
03-03 02:02:39.054: I/DEBUG(4008): 402d01ec 2102460d fb36f002 42ab6823 b123d020 .F.!..6.#h.B .#.
03-03 02:02:39.054: I/DEBUG(4008): 402d01fc b1136c5b f7c868e0 68a0fccf 05c26025 [l...h.....h%`..
03-03 02:02:39.054: I/DEBUG(4008): memory map around addr 68f52abc:
03-03 02:02:39.054: I/DEBUG(4008): 4d8c5000-4d9c4000
03-03 02:02:39.054: I/DEBUG(4008): (no map for address)
03-03 02:02:39.054: I/DEBUG(4008): b0001000-b0009000 /system/bin/linker
03-03 02:02:39.054: I/DEBUG(4008): stack:
03-03 02:02:39.054: I/DEBUG(4008): 4d9c3b88 408d1f90 /system/lib/libdvm.so
03-03 02:02:39.054: I/DEBUG(4008): 4d9c3b8c 412ef258 /dev/ashmem/dalvik-heap (deleted)
03-03 02:02:39.054: I/DEBUG(4008): 4d9c3b90 00000001
03-03 02:02:39.054: I/DEBUG(4008): 4d9c3b94 408d6c58 /system/lib/libdvm.so
03-03 02:02:39.054: I/DEBUG(4008): 4d9c3b98 408d6fa8 /system/lib/libdvm.so
03-03 02:02:39.054: I/DEBUG(4008): 4d9c3b9c 4c479dec
03-03 02:02:39.054: I/DEBUG(4008): 4d9c3ba0 46cf260a /system/framework/core.odex
03-03 02:02:39.054: I/DEBUG(4008): 4d9c3ba4 408735e7 /system/lib/libdvm.so
03-03 02:02:39.054: I/DEBUG(4008): 4d9c3ba8 412ef258 /dev/ashmem/dalvik-heap (deleted)
03-03 02:02:39.054: I/DEBUG(4008): 4d9c3bac 002bf070 [heap]
03-03 02:02:39.054: I/DEBUG(4008): 4d9c3bb0 412ef258 /dev/ashmem/dalvik-heap (deleted)
03-03 02:02:39.054: I/DEBUG(4008): 4d9c3bb4 00000000
03-03 02:02:39.054: I/DEBUG(4008): 4d9c3bb8 412ef268 /dev/ashmem/dalvik-heap (deleted)
03-03 02:02:39.054: I/DEBUG(4008): 4d9c3bbc 00000000
03-03 02:02:39.054: I/DEBUG(4008): 4d9c3bc0 df0027ad
03-03 02:02:39.054: I/DEBUG(4008): 4d9c3bc4 00000000
03-03 02:02:39.054: I/DEBUG(4008): #00 4d9c3bc8 001ad8f8 [heap]
03-03 02:02:39.054: I/DEBUG(4008): 4d9c3bcc 002ae0b8 [heap]
03-03 02:02:39.054: I/DEBUG(4008): 4d9c3bd0 00000004
03-03 02:02:39.054: I/DEBUG(4008): 4d9c3bd4 402d01dd /system/lib/libcrypto.so
03-03 02:02:39.054: I/DEBUG(4008): #01 4d9c3bd8 001ad8f8 [heap]
03-03 02:02:39.054: I/DEBUG(4008): 4d9c3bdc 002ae0b8 [heap]
03-03 02:02:39.054: I/DEBUG(4008): 4d9c3be0 00000004
03-03 02:02:39.054: I/DEBUG(4008): 4d9c3be4 4024e817 /system/lib/libnativehelper.so
03-03 02:02:39.406: D/CommService(7477): Checking OLSRd info...
03-03 02:02:39.500: D/CommService(7477): Monitoring nodes...
03-03 02:02:39.500: D/dalvikvm(7477): GC_FOR_ALLOC freed 2073K, 16% free 17118K/20359K, paused 51ms
03-03 02:02:39.632: D/dalvikvm(7477): GC_CONCURRENT freed 1998K, 16% free 17162K/20359K, paused 2ms+4ms
03-03 02:02:40.406: D/CommService(7477): Checking OLSRd info...
03-03 02:02:40.445: D/CommService(7477): Monitoring nodes...
03-03 02:02:40.562: D/dalvikvm(7477): GC_CONCURRENT freed 2045K, 16% free 17158K/20359K, paused 3ms+4ms
03-03 02:02:41.406: D/CommService(7477): Checking OLSRd info...
03-03 02:02:41.445: D/CommService(7477): Monitoring nodes...
03-03 02:02:41.531: D/dalvikvm(7477): GC_CONCURRENT freed 2045K, 16% free 17154K/20359K, paused 3ms+12ms
03-03 02:02:42.406: D/CommService(7477): Checking OLSRd info...
03-03 02:02:42.445: D/CommService(7477): Monitoring nodes...
03-03 02:02:42.507: D/dalvikvm(7477): GC_CONCURRENT freed 2068K, 16% free 17128K/20359K, paused 3ms+4ms
03-03 02:02:42.679: D/dalvikvm(7477): GC_CONCURRENT freed 2006K, 16% free 17161K/20359K, paused 2ms+12ms
03-03 02:02:43.140: I/BootReceiver(1236): Copying /data/tombstones/tombstone_05 to DropBox (SYSTEM_TOMBSTONE)
03-03 02:02:43.210: D/dalvikvm(1236): GC_FOR_ALLOC freed 912K, 17% free 10207K/12295K, paused 62ms
03-03 02:02:43.265: D/dalvikvm(1236): GC_FOR_ALLOC freed 243K, 16% free 10374K/12295K, paused 49ms
03-03 02:02:43.265: I/dalvikvm-heap(1236): Grow heap (frag case) to 10.507MB for 196628-byte allocation
Java.Lang.Object
. Разобрались моиОтветы:
Во-первых, найдите трассировку стека захоронений, она будет распечатываться каждый раз при сбое приложения. Что-то вроде этого:
Затем используйте
addr2line
утилиту (найдите ее в цепочке инструментов NDK), чтобы найти функцию, которая вылетает. В этом примере вы делаетеИ вы увидите, где у вас проблема. Конечно, это не поможет вам, так как он находится в libc.
Таким образом, вы можете объединить утилиты
arm-eabi-objdump
чтобы найти конечную цель.Поверьте мне, это сложная задача.
Просто для обновления. Я думаю, что я долгое время делал нативную сборку Android из дерева исходных текстов, и до сегодняшнего дня я сам внимательно читал документы NDK. С момента выпуска NDK-r6 он предоставляет утилиту под названием
ndk-stack
.Ниже приводится содержание официальных документов NDK с тарным шариком NDK-r9.
Обзор:
ndk-stack
это простой инструмент, который позволяет фильтровать трассировки стека по мере их появления в выходных данных adb logcat и заменять любой адрес в общей библиотеке соответствующими значениями:.В двух словах, это будет переводить что-то вроде:
В более читаемый вывод:
Использование:
Для этого вам сначала потребуется каталог, содержащий символические версии общих библиотек вашего приложения. Если вы используете систему сборки NDK (то есть
ndk-build
), то она всегда находится в $ PROJECT_PATH / obj / local /, где обозначает ABI вашего устройства (то естьarmeabi
по умолчанию).Вы можете подать
logcat
текст как прямой ввод в программу, например:Или вы можете использовать опцию -dump, чтобы указать logcat в качестве входного файла, например:
ВАЖНЫЙ :
Инструмент ищет начальную строку, содержащую начало в
logcat
выводе, то есть что-то похожее на:При копировании / вставке трасс не забывайте эту строку из трасс, иначе
ndk-stack
она не будет работать правильно.ДЕЛАТЬ:
Будущую версию
ndk-stack
постараюсь запуститьadb logcat
и выбрать путь к библиотеке автоматически. На данный момент вам придется делать эти шаги вручную.На данный
ndk-stack
момент не обрабатывает библиотеки, в которых нет отладочной информации. Может быть полезно попытаться определить ближайшую точку входа функции по заданному адресу ПК (например, как в примере libc.so выше).источник
printf
. Могу ли я увидеть вывод этогоprintf
из родных библиотек.ХОРОШО! Мне очень жаль тех, кто на самом деле представил комментарии и ответы, но я нашел проблему. Я не думаю, что это поможет многим другим, пытающимся отследить их личный SIGSEGV, но мой (и это было очень трудно) было полностью связано с этим:
https://code.google.com/p/android/issues/detail?id=8709
Libcrypto.so в моем дампе как бы подсказал мне. Я делаю MD5-хэш пакетных данных, пытаясь определить, видел ли я уже пакет, и пропускаю его, если у меня был. В какой-то момент я подумал, что это ужасная проблема с потоками, связанная с отслеживанием этих хешей, но оказалось, что это класс java.security.MessageDigest! Это не потокобезопасно!
Я поменял его с UID, который я вставлял в каждый пакет, основываясь на UUID устройства и отметке времени. С тех пор проблем нет.
Я думаю, что урок, который я могу преподнести тем, кто был в моей ситуации, - даже если вы на 100% Java-приложение, обратите внимание на собственную библиотеку и символ, отмеченные в аварийном дампе для подсказок. Поиск в Google для SIGSEGV + имя lib .so пойдет намного дальше, чем бесполезный код = 1 и т. Д. Затем подумайте, где ваше Java-приложение может касаться нативного кода, даже если вы ничего не делаете. Я допустил ошибку, предположив, что это была проблема с потоками Service + UI, когда Canvas рисовал что-то, что было нулевым (самый распространенный случай, когда я гуглил на SIGSEGV), и проигнорировал возможность, что это могло быть полностью связано с написанным мною кодом, который был связанные с lib .so в аварийном дампе. Естественно, java.security будет использовать нативный компонент в libcrypto.so для скорости, поэтому, как только я уясню, я погуглил для Android + SIGSEGV + libcrypto. так и нашел задокументированный вопрос. Удачи!
источник
Я получал эту ошибку, сохраняя объект в общих настройках в виде строки, преобразованной в gson. Строка gson оказалась бесполезной, поэтому поиск и десериализация объекта на самом деле работали некорректно. Это означало, что любой последующий доступ к объекту приводил к этой ошибке. Страшно :)
источник
android.Location
объектаSharedPreferences
вWakefulBroadcastReceiver
. В большинстве случаев это работает, но иногда я получаю страшныйSIGSEGV
сбой. Подскажите пожалуйста, как вы решили это?Я также получил эту ошибку много раз, и я решил ее. Эта ошибка возникнет в случае управления памятью на нативной стороне.
Ваше приложение обращается к памяти за пределами своего адресного пространства. Скорее всего, это неверный указатель доступа. SIGSEGV = ошибка сегментации в собственном коде. Так как это не происходит в коде Java, вы не увидите трассировку стека с подробностями. Тем не менее, вы все равно можете увидеть некоторую информацию о трассировке стека в logcat, если немного осмотритесь после сбоя процесса приложения. Он не сообщит вам номер строки в файле, но сообщит, какие объектные файлы и адреса использовались в цепочке вызовов. Оттуда вы часто можете выяснить, какая часть кода является проблематичной. Вы также можете установить собственное соединение GDB с целевым процессом и перехватить его в отладчике.
источник
Сегодня я столкнулся с
Fatal signal 11 (SIGSEGV), code 1, fault addr 0x8 in tid 18161
проблемой, и мне трудно полдня, чтобы решить эту проблему.Я пробовал много вещей, очищающих кеш и удаляющих файл .gradle и все.
Наконец-то у меня
disable Instant Run
и сейчас у меня больше нет этой проблемы. Теперь мое приложение работает после включения мгновенного запуска. Это может быть проблема мгновенного запуска, попробуйте отключить и включить мгновенный запускИз этого ответа:
источник
Попробуйте отключить аппаратное ускорение Android в своем манифесте.
источник
Я столкнулся с этой ошибкой, когда пытался получить доступ к «холсту» вне
onDraw()
Очень плохая практика: /
источник
Я получаю эту ошибку при использовании растрового изображения, как это:
Для меня исправлена проблема с уменьшением размера растрового изображения (от 1000 пикселей до 700 пикселей).
источник
BitmapOptions.inSampleSize
Я сталкивался с SIGSEGV на Android 4.4.4 (Nexuses, Samsungs) И оказалось, что фатальная ошибка была в разборе
null
String
с использованиемDecimalFormat
На Android> 21 это было успешно обработано с помощью try / catch
источник
Я столкнулся с этим вопросом минуту назад, после перехода от
android.support
кandroidx
.Проблема была
renderscript
.Решение: я удалил из
build.gradle
этих двух строк:после того, как проект не удался, из-за неразрешенных ссылок:
поэтому я изменил их на:
После этого все проблемы исчезли.
источник
Если вы используете библиотеку vitamio и эта фатальная ошибка произойдет.
Затем убедитесь, что в вашем проекте gradle targetSdkVersion должно быть меньше 23.
Спасибо.
источник
В моем случае (я использую формы Xamarin) эта ошибка возникла из-за ошибки привязки - например:
В основном я удалил свойство view модели по ошибке. Для разработчиков Xamarin, если у вас возникла та же проблема, проверьте свои привязки ...
источник
Если вы добавили некоторый нативный код C в свой проект, этот ответ может быть полезным.
Я добавил немного родного кода на C в проекте Android.
Теперь я пытался получить доступ к тому коду, который возвращал мне нативную строку, перед обработкой строки я установил ее значение по умолчанию как nullptr. Теперь при получении его значения в Java-коде столкнулся с этой проблемой.
Так как наш родной C-код отсутствует в каталоге java, мы не можем понять, какая именно строка кода создает проблему. Поэтому я бы посоветовал вам проверить ваш файл .cpp и попытаться найти какую-либо подсказку там.
Надеюсь, что вы скоро избавитесь от проблемы. :)
источник
В моем случае проблема была вызвана Android Profiler. В Android Studio нажмите «Android Profiler» и «завершить сеанс».
По иронии судьбы, это также вызывало серьезные проблемы с производительностью в приложении.
источник
Добавьте эти две строки в ваш build.gradle в разделе Android:
источник
Проверьте свой JNI / собственный код. Одна из моих ссылок была нулевой, но она была прерывистой, так что это было не очень очевидно.
источник
проверьте ваши собственные функции, правильно ли он возвращается или нет. Если он не возвращается, добавьте оператор возврата.
источник
Для меня эта проблема была из-за плохого отношения между двумя действиями. Недавно я переместил этот метод из Activity1 в другой 2. После этого рефакторинг оставил это явное приведение, как это было раньше. Так что вместо того, чтобы делать
Я должен был сделать
Примечание: но эта ошибка не произошла на Android 8.0 Я еще не уверен, почему.
*** Надеюсь, поможет.
источник
У меня была ошибка ошибки сегментации из-за проблем с памятью . Моя структура, имеющая много переменных и массивов, имела этот массив размером 1024.
PS: это обходной путь, а не решение. Необходимо найти размер структуры и динамическое распределение памяти - лучший вариант.
источник
Я получил эту ошибку, когда я использовал ViewTreeObserver внутри
onDraw()
функции.источник
У меня была эта проблема с пакетом, который был добавлен в мое приложение (FancyShowCaseView) и вызвал эту проблему на pre-lolipop. этот пакет был написан на kotlin, а мои основные коды написаны на java. так что теперь я проверяю версию в pre-lolipop и не позволяю ее классу быть выполненным. временно решил проблему. проверьте это, если у вас есть подобные проблемы, как я
источник
2 из 12 телефонов вернули ошибку, обнаружили, что проблема была в onDrawFrame (), некоторые объекты были нулевыми, я не знаю почему, я просто установил
if(gears==null) return;
,источник
У меня возникла проблема, когда я создавал PDF-файл с использованием API-интерфейсов PDF для Android, и случайно закрыл страницы PDF-файла canvas.save () и canvas.restore ().
источник