Фатальний сигнал 11 для Android (SIGSEGV) на 0x636f7d89 (код = 1). Як це можна відстежити?


221

Я читав інші публікації про відстеження причин отримання SIGSEGVдодатка для Android. Я планую шукати додаток для можливих NullPointers, пов’язаних із використанням Canvas, але мої SIGSEGVщоразу піднімають іншу адресу пам'яті. Плюс я бачив code=1і code=2. Якби адреса пам'яті була 0x00000000, я б підказав, що це NullPointer.

Останній я отримав code=2:

A/libc(4969): Fatal signal 11 (SIGSEGV) at 0x42a637d9 (code=2)

Будь-які пропозиції, як відстежити це?

У мене є підозрюваний, але я ще не прагну експериментувати з цим. Мій додаток використовує API OSMDroid для офлайн-карти. Клас OverlayItem представляє маркери / вузли на карті. У мене є служба, яка збирає дані через мережу для заповнення OverlayItem, які потім відображаються на карті. Намагаючись спростити свій дизайн, я розширив OverlayItem на власний клас NodeOverlayItem, який включає деякі атрибути додавання, які я використовую в діяльності інтерфейсу та в сервісі. Це дало мені єдиний пункт інформації про Елемент для інтерфейсу користувача та служби. Я використовував Intents для трансляції в "Активність", щоб оновити карту інтерфейсу, коли щось змінилося. Діяльність пов'язується зі Службою, і існує сервісний метод для отримання списку NodeOverlayItem. Я думаю, це може бути використання OSMDroid API OverlayItem, і мою службу оновлення інформації про вузол одночасно. (питання одночасності)

Коли я це пишу, я думаю, що це справді проблема. Головний біль не розщеплює Node та OverlayItem від NodeOverlayItem, це тому, що Діяльність потребує деяких даних з Вузла, якими володіє Служба. Крім того, коли буде створено Діяльність (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

Додайте більше інформації з журналу про збій.
auselen

Я виправляв подібну помилку раніше, і очікував би, що це станеться після запуску сміттєзбірника. Це те, що ти бачиш?
Павло Ніконович

32
Як ви перейшли від однієї лінії до того гігантського сліду стека? Я застряг в одному рядку і не можу зрозуміти, чому мій додаток виходить з ладу.
Шон Біч

врешті-решт, розширивши всі мої об’єкти Java.Lang.Object. Розібрав мої збої
П'єр

11
Щоб отримати весь слід стека з посиланнями на адресу, просто припиніть фільтрувати логката за вашим процесом програми. Це буде трохи нижче помилки SIGSEGV.
alexbchr

Відповіді:


166

По-перше, знайдіть свій стек надгробних плит, він буде надрукований щоразу, коли ваше додаток вийде з ладу. Щось на зразок цього:

*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Build fingerprint: 'XXXXXXXXX'
pid: 1658, tid: 13086  >>> system_server <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 64696f7e
 r0 00000000  r1 00000001  r2 ad12d1e8  r3 7373654d
 r4 64696f72  r5 00000406  r6 00974130  r7 40d14008
 r8 4b857b88  r9 4685adb4  10 00974130  fp 4b857ed8
 ip 00000000  sp 4b857b50  lr afd11108  pc ad115ebc  cpsr 20000030
 d0  4040000040000000  d1  0000004200000003
 d2  4e72cd924285e370  d3  00e81fe04b1b64d8
 d4  3fbc71c7009b64d8  d5  3fe999999999999a
 d6  4010000000000000  d7  4000000000000000
 d8  4000000000000000  d9  0000000000000000
 d10 0000000000000000  d11 0000000000000000
 d12 0000000000000000  d13 0000000000000000
 d14 0000000000000000  d15 0000000000000000
 scr 80000012

         #00  pc 000108d8  /system/lib/libc.so
         #01  pc 0003724c  /system/lib/libxvi020.so
         #02  pc 0000ce02  /system/lib/libxvi020.so
         #03  pc 0000d672  /system/lib/libxvi020.so
         #04  pc 00010cce  /system/lib/libxvi020.so
         #05  pc 00004432  /system/lib/libwimax_jni.so
         #06  pc 00011e74  /system/lib/libdvm.so
         #07  pc 0004354a  /system/lib/libdvm.so
         #08  pc 00017088  /system/lib/libdvm.so
         #09  pc 0001c210  /system/lib/libdvm.so
         #10  pc 0001b0f8  /system/lib/libdvm.so
         #11  pc 00059c24  /system/lib/libdvm.so
         #12  pc 00059e3c  /system/lib/libdvm.so
         #13  pc 0004e19e  /system/lib/libdvm.so
         #14  pc 00011b94  /system/lib/libc.so
         #15  pc 0001173c  /system/lib/libc.so

code around pc:
ad115e9c 4620eddc bf00bd70 0001736e 0001734e 
ad115eac 4605b570 447c4c0a f7f44620 e006edc8 
ad115ebc 42ab68e3 68a0d103 f7f42122 6864edd2 
ad115ecc d1f52c00 44784803 edbef7f4 bf00bd70 
ad115edc 00017332 00017312 2100b51f 46682210 

code around lr:
afd110e8 e2166903 1a000018 e5945000 e1a02004 
afd110f8 e2055a02 e1a00005 e3851001 ebffed92 
afd11108 e3500000 13856002 1a000001 ea000009 
afd11118 ebfffe50 e1a01004 e1a00006 ebffed92 
afd11128 e1a01005 e1550000 e1a02006 e3a03000 

stack:
    4b857b10  40e43be8  
    4b857b14  00857280  
    4b857b18  00000000  
    4b857b1c  034e8968  
    4b857b20  ad118ce9  /system/lib/libnativehelper.so
    4b857b24  00000002  
    4b857b28  00000406

Потім скористайтеся addr2lineутилітою (знайдіть її у ланцюжку інструментів NDK), щоб знайти функцію, яка виходить з ладу. У цьому зразку ви робите

addr2line -e -f libc.so 0001173c

І ви побачите, звідки у вас проблема. Звичайно, це не допоможе вам, оскільки воно знаходиться в libc.

Таким чином, ви можете об'єднати утиліти, arm-eabi-objdumpщоб знайти кінцеву ціль.

Повірте, це важке завдання.




Просто для оновлення. Я думаю, що я досить давно займався побудовою Android з цілого дерева-джерела, до сьогодні я сам уважно читав документи NDK. З часу випуску NDK-r6 він надав утиліту під назвою ndk-stack.

Далі йде зміст офіційних документів NDK з кулькою NDK-r9.

Огляд:

ndk-stack це простий інструмент, який дозволяє відфільтрувати сліди стека, коли вони з'являються у висновку 'adb logcat' і замінити будь-яку адресу всередині спільної бібліотеки на відповідні: значення.

Коротше кажучи, це перекладе щось на зразок:

  I/DEBUG   (   31): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
  I/DEBUG   (   31): Build fingerprint: 'generic/google_sdk/generic/:2.2/FRF91/43546:eng/test-keys'
  I/DEBUG   (   31): pid: 351, tid: 351  %gt;%gt;%gt; /data/local/ndk-tests/crasher <<<
  I/DEBUG   (   31): signal 11 (SIGSEGV), fault addr 0d9f00d8
  I/DEBUG   (   31):  r0 0000af88  r1 0000a008  r2 baadf00d  r3 0d9f00d8
  I/DEBUG   (   31):  r4 00000004  r5 0000a008  r6 0000af88  r7 00013c44
  I/DEBUG   (   31):  r8 00000000  r9 00000000  10 00000000  fp 00000000
  I/DEBUG   (   31):  ip 0000959c  sp be956cc8  lr 00008403  pc 0000841e  cpsr 60000030
  I/DEBUG   (   31):          #00  pc 0000841e  /data/local/ndk-tests/crasher
  I/DEBUG   (   31):          #01  pc 000083fe  /data/local/ndk-tests/crasher
  I/DEBUG   (   31):          #02  pc 000083f6  /data/local/ndk-tests/crasher
  I/DEBUG   (   31):          #03  pc 000191ac  /system/lib/libc.so
  I/DEBUG   (   31):          #04  pc 000083ea  /data/local/ndk-tests/crasher
  I/DEBUG   (   31):          #05  pc 00008458  /data/local/ndk-tests/crasher
  I/DEBUG   (   31):          #06  pc 0000d362  /system/lib/libc.so
  I/DEBUG   (   31):

До більш зрозумілого результату:

  ********** Crash dump: **********
  Build fingerprint: 'generic/google_sdk/generic/:2.2/FRF91/43546:eng/test-keys'
  pid: 351, tid: 351  >>> /data/local/ndk-tests/crasher <<<
  signal 11 (SIGSEGV), fault addr 0d9f00d8
  Stack frame #00  pc 0000841e  /data/local/ndk-tests/crasher : Routine zoo in /tmp/foo/crasher/jni/zoo.c:13
  Stack frame #01  pc 000083fe  /data/local/ndk-tests/crasher : Routine bar in /tmp/foo/crasher/jni/bar.c:5
  Stack frame #02  pc 000083f6  /data/local/ndk-tests/crasher : Routine my_comparison in /tmp/foo/crasher/jni/foo.c:9
  Stack frame #03  pc 000191ac  /system/lib/libc.so
  Stack frame #04  pc 000083ea  /data/local/ndk-tests/crasher : Routine foo in /tmp/foo/crasher/jni/foo.c:14
  Stack frame #05  pc 00008458  /data/local/ndk-tests/crasher : Routine main in /tmp/foo/crasher/jni/main.c:19
  Stack frame #06  pc 0000d362  /system/lib/libc.so

Використання:

Для цього вам спочатку знадобиться каталог, що містить символічні версії спільних бібліотек вашої програми. Якщо ви використовуєте систему збирання NDK (тобто ndk-build), вони завжди знаходяться під $ PROJECT_PATH / obj / local /, де означає ABI вашого пристрою (тобто armeabiза замовчуванням).

logcatТекст можна подавати як прямий вхід до програми, наприклад:

adb logcat | $NDK/ndk-stack -sym $PROJECT_PATH/obj/local/armeabi

Або ви можете використовувати параметр -dump, щоб вказати logcat як вхідний файл, наприклад:

adb logcat > /tmp/foo.txt
$NDK/ndk-stack -sym $PROJECT_PATH/obj/local/armeabi -dump foo.txt

ВАЖЛИВО:

Інструмент шукає початковий рядок, який містить запуски у logcatвисновку, тобто щось таке, що виглядає так:

 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***

Коли копіюєте / вставляєте сліди, не забувайте цей рядок із слідів, ndk-stackінакше він не працює належним чином.

РОБИТИ:

Майбутня версія програми ndk-stackспробує запустити adb logcatта вибрати шлях бібліотеки автоматично. Поки що вам доведеться виконати ці дії вручну.

На сьогоднішній день ndk-stackне обробляє бібліотеки, у яких немає інформації про налагодження. Може бути корисним спробувати виявити найближчу точку входу функції до заданої адреси ПК (наприклад, як у прикладі libc.so вище).


7
Вибачте Робін. Я ціную відповідь. Якби я опублікував свій асистентний збір, про що я вже писав в іншому запитанні про нього, ви, можливо, змогли б відповісти в контексті. Однак я вирішив дати вам 100 баунтів (з мого дорогоцінного представника!), Оскільки ви єдиний, хто намагався вирішити завдання простежити аварію до рідного джерела бібліотеки.
часник

1
Привіт Робін. велике спасибі за детальну та інформативну відповідь. Мені було цікаво, чи можна друкувати інформацію всередині рідних бібліотек. У моїх рідних бібліотеках є багато інформації про налагодження, яку я надрукував за допомогою printf. Чи можу я побачити вихід printfіз рідних бібліотек.
Саад Сааді

#include <android / Log.h> #define LOGD (...) android_log_print (ANDROID_LOG_DEBUG, "YOURTAG", __ VA_ARGS )
Робін

Ви щойно врятували мені дні налагодження за допомогою цієї команди ndk-stack! Я насправді не розумію, як я цього не знайшов раніше
Traian

Гаразд я надрукував дамп аварійного завершення роботи, але все ще не розумію вихід.
Хілал

48

ГАРАЗД! Мені дуже шкода тих, хто насправді надіслав коментарі та відповіді, але я знайшов проблему. Я не думаю, що це допоможе багатьом іншим, хто намагається знайти свій особистий SIGSEGV, але моє (і це було дуже важко) було повністю пов'язане з цим:

https://code.google.com/p/android/isissue/detail?id=8709

Libcrypto.so в моєму дампінгу ввімкнув мене. Я роблю хеш даних пакетних даних MD5, коли намагаюся визначити, чи я вже бачив пакет, і пропускаю його, якби мав. Я подумав, що в один момент це була потворна проблема, пов’язана з відстеженням цих хешей, але виявилося, що це клас java.security.MessageDigest! Це не безпечно для ниток!

Я поміняв це на UID, який я заповнював у кожному пакеті на основі пристрою UUID та часової позначки. З тих пір жодних проблем.

Я здогадуюсь, що урок, який я можу сказати тим, хто опинився в моїй ситуації, - це навіть якщо ви 100% додаток Java, зверніть увагу на рідну бібліотеку та символ, відмічений на смітнику для крашків. Гуглінг для SIGSEGV + lib .so, ім’я піде набагато далі, ніж марний код = 1 тощо. Далі подумайте, де ваша програма Java могла б торкнутися рідного коду, навіть якщо це нічого, що ви робите. Я допустив помилку, вважаючи, що це проблема з прошивкою сервісу + інтерфейсу користувача, де Canvas малює щось, що є нульовим, (найпоширеніший випадок, коли я гугл на SIGSEGV), і проігнорував можливість, що це могло бути повністю пов'язане з кодом, який я написав, що був пов'язані з lib .so у сміттєзвалищі. Природно, java.security використовує натурний компонент у libcrypto.so для швидкості, тому, як тільки я втягнувся, я завів Googlegled для Android + SIGSEGV + libcrypto. так і знайшов задокументований випуск. Удачі!


1
Маю подібну проблему, все ще з MessageDigest, добре, зовсім не безпечно. Замість приємного винятку, ми отримуємо потворну аварію!
Бамако

У мене була подібна річ з розшифровкою RSA за допомогою Openssl. Переміщення операції в новій потоці вирішило проблему.
пецепс

41

Я отримував цю помилку, зберігаючи об'єкт у спільних налаштуваннях у вигляді рядка, перетвореного в gson. Рядок gson не був корисним, тому вилучення та десеріалізація об'єкта насправді не працювало коректно. Це означало, що будь-який наступний доступ до об'єкта призвів до цієї помилки. Страшно :)


6
Дякую, це просто врятувало мені життя :))) Ви отримаєте це, якщо об’єкт, який намагається перетворити gson, не має дійсного конструктора (я намагався це з класом android.Location, даючи цю помилку)
rosu alin

5
@rosualin О боже мій! Це може бути саме моєю проблемою (витягаючи волосся тут). Я теж зберігання android.Locationоб'єкта SharedPreferencesв WakefulBroadcastReceiver. Більшість випадків це працює, але іноді я отримую жахливий SIGSEGVзбій. Чи можете ви поділитися, як ви вирішили?
camelCaseCoder

3
Ну, я намагався зберегти android.Location або Geofence у спільних налаштуваннях, і не маючи конструктора, це спричинило б це. Тому я зробив спеціальний клас із потрібними мені даними та просто зберег. Сподіваюся, це допомагає.
rosu alin

3
@rosualin Це спрацювало !!!!!!!!!!! Ви рятувальник життя !!! Я пішов з розуму на цю дурну помилку протягом останніх 4 днів. Дуже дякую!!!!
camelCaseCoder

1
Радий, що можу допомогти: D
rosu alin

30

Я також багато разів отримував цю помилку, і я її вирішив. Ця помилка зіткнеться у випадку управління пам’яттю на рідній стороні.

Ваша програма отримує доступ до пам'яті за межами свого адресного простору. Це, швидше за все, недійсний доступ до вказівника. SIGSEGV = помилка сегментації у власному коді. Оскільки він не зустрічається в коді Java, ви не побачите сліду стека з деталями. Однак ви все ще можете побачити деяку інформацію про сліди стека в логкатах, якщо трохи озирнутися після завершення процесу заявки. Він не повідомить вам номер рядка у файлі, але підкаже, які об’єктні файли та адреси використовувались у ланцюзі викликів. Звідти часто можна зрозуміти, яка область коду є проблематичною. Ви також можете встановити нативне з'єднання gdb до цільового процесу та вловити його у відладчику.


У моєму випадку було так, що основний компонент java.security.MessageDigest не є безпечним для потоків, і я отримував доступ до нього з 2-х потоків. (створіть хеш і зберігайте, а потім створіть хеш і порівняйте)
чеснок

Ви не отримаєте цей фатальний виняток через java.security, MessageDigest або будь-яку нитку. Це може бути не точне місце, де пам'ять пошкоджується. Наприклад, якщо ви пошкодили купу, будь-яка кількість операцій пізніше може бути здійснена, і це може бути поза межами простору NDK. Ви не дізнаєтесь до кінця функції.
Вівек Бансал

Припустимо, якщо ваш код перерветься у рядку 10 на рідній стороні, то навіть після цього ваш код буде працювати нормально, і після виконання деяких рядків коду він викине цю помилку в частині Java. Це буває. "Java буде викидати винятки, коли ви переходите за межі пам'яті". Так, на щастя, але просто для уточнення, якщо він перевищує пам'ять у C / C ++ і він переходить на Java, додаток може вийти з ладу, не кидаючи стандартний виняток Java. Ось чому станеться смертельна екзекція.
Vivek Bansal

Спробуйте виявити помилку в рідній стороні, де ви використовували будь-який масив даних. У більшості випадків це відбудеться в масивах даних, коли помилково ви перетнете його межі або обмеження даних.
Vivek Bansal

24

Сьогодні я зіткнувся з Fatal signal 11 (SIGSEGV), code 1, fault addr 0x8 in tid 18161проблемою, і я півдня намагаюся вирішити це.

Я спробував багато чого очистити кеш і видалити файл .gradle та все.

Нарешті, я disable Instant Runі зараз більше не отримую цього питання. Тепер моя програма працює і після включення миттєвого запуску. Це може бути проблема миттєвого запуску. Спробуйте вимкнути та включити миттєвий запуск

З цієї відповіді:

Перейдіть у Налаштування чи налаштування Android Studio (для MAC) -> Збірка, виконання, розгортання -> Миттєвий запуск.

Потім зніміть прапорець "Увімкнути миттєвий запуск" у верхній частині.


1
Я витратив пів дня на те, щоб знайти цю неіснуючу помилку, поки не знайшов рішення. Дуже дякую, чоловіче!
Канат

1
Те саме питання для мене після оновлення до androidx. Я маю залишити миттєвий розбіг.
JamesD

виїзд, але сигнал 11 (SIGSEGV), код 2 (SEGV_ACCERR)
Chego

Привіт, я використовую android studio 3.5.1, і я майже день намагався виправити це, але все-таки у мене є та сама проблема, у мене є фрагмент google map, і вона працює лише перший раз, коли я встановлював додаток після цього кожен раз, коли я відкрити додаток, дайте мені нижче Фатальний сигнал 11 (SIGSEGV), код 1, помилка addx 0xff3a200c в tid 15323 (FinalizerDaemon)
Navin

У випадку з Android Studio 3.5 і вище вам потрібно скористатися опцією "Застосувати зміни". Спробуйте ввімкнути та вимкнути цю опцію. Це працювало для мене.
Аанал ​​Мехта

12

Спробуйте відключити апаратне прискорення Android у своєму маніфесті.

android:hardwareAccelerated="false"

2
це працює, але зовсім не гарне рішення !! зупиняє всі анімаційні та графічні речі
Mohsen

у мене є те саме питання, але не працювало з моєї сторони, я використав google map у фрагменті, і коли я відкрив програму, він зазнав аварії Fatal signal 11 (SIGSEGV), код 1, помилка addr 0x3f000000 в 16591 (FinalizerDaemon), я спробував майже день, але не знайшов правильного рішення для цього, він працював лише кілька разів, тоді він дає помилку
Navin

11

Я зіткнувся з цією помилкою, коли намагався отримати доступ до "полотна" поза межами onDraw()

    private Canvas canvas;

    @Override
    protected void onDraw(Canvas canvas) {
        this.canvas = canvas;
        ....... }

    private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
        @Override
        public boolean onScale(ScaleGestureDetector detector) { 
            canvas.save(); // here

Дуже погана практика: /


5

Я отримував цю помилку при використанні растрової карти на зразок цієї:

bmp = BitmapFactory.decodeResource(this.getResources(), R.drawable.myBitMap);

Для мене виправлена ​​проблема - зменшити розмір растрової карти (> 1000px high to 700px).


просто використовуйте замість цьогоBitmapOptions.inSampleSize
FindOut_Quran

4

Я стикався з SIGSEGV на Android 4.4.4 (Nexuses, Samsung). І виявилося, що фатальна помилка була в аналізі null StringвикористанняDecimalFormat

 static DecimalFormat decimalFormat = new DecimalFormat("###,###.###");
 void someMethod(String value) {
...
    Number number = decimalFormat.parse(value);//value is null, SIGSEGV will happen`
...
}

На Android> 21 це було успішно оброблено за допомогою try / catch


3

Я зіткнувся з цим питанням мить тому, після міграції з android.supportдо androidx.

Проблема була renderscript.

Рішення: я видалив із build.gradleцих двох рядків:

renderscriptTargetApi 21
renderscriptSupportModeEnabled true

після цього будівництво проекту не вдалося через невирішені посилання:

import androidx.renderscript.Allocation;
import androidx.renderscript.Element;
import androidx.renderscript.RenderScript;
import androidx.renderscript.ScriptIntrinsicBlur;

тому я змінив їх на:

import android.renderscript.Allocation;
import android.renderscript.Element;
import android.renderscript.RenderScript;
import android.renderscript.ScriptIntrinsicBlur;

Після цього всіх проблем не було.


2

Якщо ви користуєтеся бібліотекою vitamio, сталася ця фатальна помилка.

Потім переконайтесь, що у вашому проекті GradS targetSdkVersion має бути менше 23.

Дякую.


Ваше рішення працює, але це може бути головною проблемою, оскільки Play Store робиться в обов'язковому порядку для встановлення targetSdkversion>> 26 серпня.
Шишир Шетті

2

У моєму випадку (я використовую Xamarin Forms) ця помилка була видалена через помилку прив’язки - наприклад:

<Label Grid.Column="4" Grid.Row="1" VerticalTextAlignment="Start" HorizontalTextAlignment="Center"  VerticalOptions="Start" HorizontalOptions="Start" FontSize="10" TextColor="Pink" Text="{Binding }"></Label>

В основному я помилково видалив властивість моделі перегляду. Для розробників Xamarin, якщо у вас є та сама проблема, перевірте свої вкладення ...


2

Якщо ви додали якийсь корінний код С у свій проект, ця відповідь може бути корисною.

Я додав якийсь рідний код С в проект Android.

Тепер я намагався отримати доступ до цього коду, який повертав мені рідну рядок, перш ніж обробляти рядок, я встановив його значення за замовчуванням як nullptr. Тепер після отримання свого значення в коді Java натрапив на цю проблему.

Оскільки наш кодовий код C знаходиться поза каталогом java, тож не виникає поняття точного рядка коду, який створює проблему. Тому я б запропонував вам перевірити .cpp-файл і спробувати знайти там будь-яку підказку.

Сподіваємось, що незабаром ви позбудетеся проблеми. :)


1

У моєму випадку проблему викликав Android Profiler. В Android Studio натисніть «Android Profiler» та «завершити сеанс».

Як не дивно, це також спричиняло надзвичайні проблеми в роботі додатка.


1

Додайте ці два рядки до свого build.gradle в розділі Android:

android{
    compileOptions {
            sourceCompatibility 1.8
            targetCompatibility 1.8
        }
}

5
Хоча цей код може вирішити питання, краще додати контекст, чому / як він працює. Це може допомогти майбутнім користувачам навчитися та застосувати ці знання до власного коду. Ви також можете мати позитивні відгуки від користувачів у вигляді оновлень, коли пояснюється код.
borchvm

0

Перевірте свій JNI / рідний код. Одне з моїх посилань було недійсним, але воно було переривчастим, тому було не дуже очевидним.


0

перевірте свої власні функції, повертається він належним чином чи ні, якщо він не повернувся, додайте заяви про повернення.


0

Для мене це питання було пов’язане з поганою роллю між двома видами діяльності. Нещодавно я перенесла цей метод з Activity1 на інший 2. Зробивши це, рефактор залишив цей явний формат, як це було раніше. Тож замість того, щоб робити

((Activity1) mainActivity).hideDialog();

Я повинен був зробити

((Activity2) mainActivity).hideDialog();

Примітка: Але ця помилка не сталася на android 8.0 Я ще не впевнений, чому.

*** Сподіваюся, що це допомагає.


0

У мене була помилка помилки сегментації через проблеми з пам'яттю . Моя структура, що має багато змінних та масивів, мала цей масив розміром 1024.

Зменшивши розмір до 512, помилки не було.

PS: Це рішення, а не рішення. Необхідно знайти розмір структури, а динамічне розподіл пам'яті - кращий варіант.


У мене те саме питання, але воно працює в зворотному напрямку. Я зберігаю до 492 даних у своєму масиві. Якщо я встановив розмір як 512, з’явиться помилка сегментації і закриє додаток, коли я збільшую розмір до 1024, він не з’являється. У мене виникають проблеми з розумінням того, як це працює.
вісім

0

Я отримав цю помилку, коли використовував функцію ViewTreeObserver всередині onDraw().

@Override
protected void onDraw(Canvas canvas) {
    // super.onDraw(canvas);
    ViewTreeObserver vto = mTextView.getViewTreeObserver();
    vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            // some animation        
        }
    });
 }

Я вирішив це, видаливши ViewTreeObserver з onDraw
muzamil

0

У мене виникла ця проблема з пакетом, який було додано до мого додатка (FancyShowCaseView), і це спричинило цю проблему під час попереднього перегляду. цей пакет був написаний у kotlin, а мої основні коди були написані на Java. тому зараз я перевіряю версію в pre-lolipop і не дозволяю виконувати її клас. тимчасово вирішили проблему. перевірте це, якщо у вас є подібні проблеми, як у мене


0

Створіть відбиток пальців: 'motorola / harpia / harpia: 6.0.1 / MPIS24.241-2.50-16 / 16: користувач / ключі випуску' Ревізія: 'p1b0' ABI: 'arm' pid: 18139, tid: 25935, name: GLThread 2137 >>> com.portable3d.okt.a3dmap1 <<< сигнал 11 (SIGSEGV), код 2 (SEGV_ACCERR), помилка addx 0x7452f000

2 з 12 телефонів повернув помилку, виявив, що проблема в onDrawFrame (), деякі об’єкти були нульовими, я не знаю чому, я просто встановив

if(gears==null) return;.


0

У мене виникла проблема, коли я створював PDF за допомогою API-файлів PDF для Android, і я випадково використав canvas.save () та canvas.restore () після закриття сторінки PDF.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.