Android Fatal signal 11 (SIGSEGV) pada 0x636f7d89 (kode = 1). Bagaimana bisa dilacak?


221

Saya telah membaca posting lain tentang melacak alasan mendapatkan SIGSEGVaplikasi Android. Saya berencana untuk menjelajahi aplikasi saya untuk kemungkinan NullPointers yang terkait dengan penggunaan Canvas, tetapi SIGSEGVbarfs saya mendapatkan alamat memori yang berbeda setiap kali. Plus saya sudah melihat code=1dan code=2. Jika alamat memori itu 0x00000000, saya punya petunjuk itu adalah NullPointer.

Yang terakhir saya dapatkan adalah code=2:

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

Ada saran tentang cara melacak ini?

Saya memiliki tersangka, tetapi saya belum tertarik untuk mencobanya. Aplikasi saya menggunakan OSMDroid API untuk pemetaan offline. Kelas OverlayItem mewakili marker / node pada peta. Saya memiliki Layanan yang mengumpulkan data melalui jaringan untuk mengisi OverlayItem yang kemudian ditampilkan di peta. Dalam upaya menyederhanakan desain saya, saya memperluas OverlayItem ke dalam kelas NodeOverlayItem saya sendiri, yang mencakup beberapa atribut tambahan yang saya gunakan dalam Aktivitas UI dan dalam Layanan. Ini memberi saya satu titik informasi Item untuk UI dan Layanan. Saya menggunakan Intents untuk menyiarkan Kegiatan untuk menyegarkan peta UI ketika sesuatu berubah. Aktivitas mengikat ke Layanan dan ada metode Layanan untuk mendapatkan daftar NodeOverlayItem. Saya pikir itu mungkin penggunaan API OverlayItem OSMDroid, dan Layanan saya memperbarui informasi simpul pada saat yang sama. (masalah konkurensi)

Saat saya menulis ini, saya pikir itulah masalahnya. Sakit kepala tidak memecah Node dan OverlayItem dari NodeOverlayItem, itu karena Kegiatan akan memerlukan beberapa data dari Node, yang dimiliki Layanan. Ditambah lagi saat Activity dibuat (onResume, dll ...) objek OverlayItem perlu dibuat ulang dari data Node yang telah dipertahankan oleh Layanan ketika Activity sedang tidak ada. mis. Anda memulai aplikasi, Layanan mengumpulkan data, UI menampilkannya, Anda pergi ke Rumah, lalu kembali ke aplikasi, Kegiatan perlu menarik dan membuat kembali OverlayItem dari data simpul Layanan terbaru.

Saya tahu ini bukan pertanyaan yang bagus atau jelas. Ini seperti semua pertanyaan SO saya bersifat khusus atau tidak jelas. Jika ada yang punya saran tentang bagaimana menafsirkan SIGSEGVkesalahan - kesalahan itu, itu akan sangat dihargai!

UPDATE Inilah crash terbaru yang ditangkap selama sesi debug. Saya memiliki 3 perangkat ini yang digunakan untuk pengujian dan mereka tidak semua crash andal ketika saya mengembangkan dan menguji. Saya memasukkan sedikit tambahan hanya agar pencatatan GC dapat dicatat. Anda bisa melihat masalahnya mungkin tidak terkait dengan kehabisan memori.

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

Tambahkan lebih banyak informasi dari log tentang kerusakan.
auselen

Saya telah memperbaiki bug seperti ini sebelumnya dan akan berharap untuk melihat ini terjadi setelah pengumpul sampah dijalankan. Apakah itu yang Anda lihat?
Paul Nikonowicz

32
Bagaimana Anda beralih dari satu baris ke jejak tumpukan raksasa itu? Saya terjebak dengan satu baris dan tidak tahu mengapa aplikasi saya mogok.
Pantai Sean

akhirnya memperpanjang semua objek saya dengan Java.Lang.Object. Menyelesaikan kecelakaan saya
Pierre

11
Untuk mendapatkan seluruh jejak jejak dengan referensi alamat, cukup berhenti memfilter logcat dengan proses aplikasi Anda. Itu akan tepat di bawah kesalahan SIGSEGV.
alexbchr

Jawaban:


166

Pertama, dapatkan jejak tumpukan batu nisan Anda, itu akan dicetak setiap kali aplikasi Anda mogok. Sesuatu seperti ini:

*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
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

Kemudian, gunakan addr2lineutilitas (temukan di rantai alat NDK Anda) untuk menemukan fungsi yang macet. Dalam sampel ini, Anda lakukan

addr2line -e -f libc.so 0001173c

Dan Anda akan melihat dari mana Anda mendapat masalah. Tentu saja ini tidak akan membantu Anda karena itu ada di libc.

Jadi, Anda dapat menggabungkan utilitas arm-eabi-objdumpuntuk menemukan target akhir.

Percayalah, ini tugas yang sulit.




Hanya untuk pembaruan. Saya pikir saya sedang melakukan pembangunan Android asli dari seluruh-sumber-pohon untuk waktu yang cukup lama, sampai hari ini saya sendiri dengan hati-hati membaca dokumen NDK. Sejak rilis NDK-r6, ia telah menyediakan utilitas yang disebut ndk-stack.

Berikut ini adalah konten dari dokumen NDK resmi dengan bola tar NDK-r9.

Gambaran:

ndk-stack adalah alat sederhana yang memungkinkan Anda untuk menyaring jejak tumpukan saat muncul di output 'adb logcat' dan mengganti alamat apa pun di dalam pustaka bersama dengan nilai: yang sesuai.

Singkatnya, ini akan menerjemahkan sesuatu seperti:

  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):

Ke dalam keluaran yang lebih mudah dibaca:

  ********** 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

Pemakaian:

Untuk melakukan ini, pertama Anda perlu direktori yang berisi versi simbolis dari pustaka bersama aplikasi Anda. Jika Anda menggunakan sistem pembangunan NDK (yaitu ndk-build), maka ini selalu berada di bawah $ PROYEK_PATH / obj / lokal /, di mana singkatan dari ABI perangkat Anda (yaitu armeabisecara default).

Anda dapat memberi makan logcatteks baik sebagai input langsung ke program, misalnya:

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

Atau Anda dapat menggunakan opsi -dump untuk menentukan logcat sebagai file input, misalnya:

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

PENTING :

Alat mencari baris awal yang berisi mulai di logcatoutput, yaitu sesuatu yang terlihat seperti:

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

Saat menyalin / menempelkan jejak, jangan lupakan baris ini dari jejak, atau ndk-stacktidak akan berfungsi dengan benar.

MELAKUKAN:

Versi mendatang ndk-stackakan mencoba meluncurkan adb logcatdan memilih jalur pustaka secara otomatis. Untuk saat ini, Anda harus melakukan langkah-langkah ini secara manual.

Sampai sekarang, ndk-stacktidak menangani perpustakaan yang tidak memiliki informasi debug di dalamnya. Mungkin bermanfaat untuk mencoba mendeteksi titik masuk fungsi terdekat ke alamat PC yang diberikan (misalnya seperti dalam libc.so contoh di atas).


7
Maaf Robin Saya menghargai jawabannya. Jika saya telah memposting crash crash saya, yang saya lakukan di Pertanyaan lain tentang hal itu secara khusus, Anda mungkin dapat menjawab dalam konteks Namun saya memutuskan untuk memberi Anda 100 karunia (dari perwakilan saya yang berharga!) Karena Anda adalah satu-satunya di mana saja yang mencoba menangani tugas melacak kembali ke sumber perpustakaan asli.
garlicman

1
Hai Robin. terima kasih banyak atas jawaban yang terperinci dan informatif. Saya bertanya-tanya, apakah mungkin untuk mencetak informasi di dalam perpustakaan asli. Pustaka asli saya memiliki banyak informasi debug yang dicetak menggunakan saya printf. Bisakah saya melihat output dari printfperpustakaan asli.
Saad Saadi

#include <android / Log.h> #define LOGD (...) android_log_print (ANDROID_LOG_DEBUG, "YOURTAG", __ VA_ARGS )
Robin

Anda baru saja menyelamatkan saya dari debugging hari dengan perintah ndk-stack! Saya benar-benar tidak mengerti kenapa saya tidak menemukannya sebelumnya ...
Traian

oke saya sudah mencetak crash dump tapi masih belum mengerti outputnya.
Hilal

48

BAIK! Saya benar-benar minta maaf kepada mereka yang telah benar-benar mengirimkan komentar dan jawaban, tetapi saya menemukan masalahnya. Saya tidak berpikir ini akan membantu banyak orang lain yang mencoba melacak SIGSEGV pribadi mereka, tetapi milik saya (dan itu sangat sulit) sepenuhnya terkait dengan ini:

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

Libcrypto.so dalam dump saya memberi petunjuk. Saya melakukan hash MD5 data paket ketika mencoba untuk menentukan apakah saya sudah melihat paket itu, dan melewatkannya jika sudah. Saya pikir pada satu titik ini adalah masalah threading jelek terkait dengan pelacakan hash itu, tapi ternyata itu adalah kelas java.security.MessageDigest! Ini bukan utas yang aman!

Saya menukarnya dengan UID yang saya isikan di setiap paket berdasarkan perangkat UUID dan cap waktu. Tidak ada masalah sejak itu.

Saya kira pelajaran yang bisa saya berikan kepada orang-orang yang berada dalam situasi saya adalah, bahkan jika Anda adalah aplikasi Java 100%, perhatikan perpustakaan asli dan simbol yang tercantum dalam dump crash untuk petunjuk. Googling untuk SIGSEGV + lib. Sehingga nama akan jauh lebih jauh daripada kode yang tidak berguna = 1, dll ... Selanjutnya pikirkan tentang di mana aplikasi Java Anda dapat menyentuh kode asli, bahkan jika itu bukan yang Anda lakukan. Saya membuat kesalahan dengan menganggap itu adalah masalah threading Layanan + UI di mana Kanvas menggambar sesuatu yang nol, (kasus yang paling umum saya Google di SIGSEGV) dan mengabaikan kemungkinan itu bisa sepenuhnya terkait dengan kode yang saya tulis itu terkait dengan lib .so di dump kecelakaan. Tentu saja java.security akan menggunakan komponen asli di libcrypto.so untuk kecepatan, jadi setelah saya masuk, saya mencari Google untuk Android + SIGSEGV + libcrypto. jadi dan menemukan masalah yang didokumentasikan. Semoga berhasil!


1
Punya masalah serupa, masih dengan MessageDigest, ok, tidak aman sama sekali. Alih-alih pengecualian yang bagus, kita mendapatkan crash jelek!
Bamaco

Saya memiliki hal yang mirip dengan dekripsi RSA menggunakan Openssl. Memindahkan operasi di utas baru menyelesaikan masalah.
peceps

41

Saya mendapatkan kesalahan ini dengan menyimpan objek ke preferensi bersama sebagai string yang dikonversi gson. String gson tidak baik, jadi mengambil dan menghapus deserialisasi objek tidak benar-benar berfungsi dengan benar. Ini berarti setiap akses berikutnya ke objek mengakibatkan kesalahan ini. Menakutkan :)


6
Terima kasih, ini baru saja menyelamatkan hidup saya :))) Anda akan mendapatkan ini jika objek yang gson coba konversi tidak memiliki konstruktor yang valid (saya mencoba dengan android.Lokasi kelas, memberikan kesalahan ini)
rosu alin

5
@rosualin Ya Tuhan! Ini mungkin justru masalah saya (mencabut rambut saya di sini). Saya terlalu menyimpan android.Locationobjek di SharedPreferencesdalam WakefulBroadcastReceiver. Sebagian besar waktu itu berhasil tetapi kadang-kadang saya mengalami SIGSEGVkecelakaan yang menakutkan . Bisakah Anda berbagi bagaimana Anda menyelesaikannya?
camelCaseCoder

3
Yah saya sedang mencoba untuk menyimpan android. Lokasi atau Geofence di preferensi bersama, dan tidak memiliki konstruktor, itu akan menyebabkan itu. Jadi saya melakukan kelas khusus, dengan data yang saya butuhkan dan hanya menyimpannya. Semoga ini bisa membantu.
rosu alin

3
@rosualin Berhasil !!!!!!!!!!! Anda adalah penyelamat !!! Saya menjadi gila pada bug bodoh ini selama 4 hari terakhir. Terima kasih banyak!!!!
camelCaseCoder

1
Senang saya bisa membantu: D
rosu alin

30

Saya juga mendapatkan kesalahan ini berkali-kali dan saya menyelesaikannya. Kesalahan ini akan dihadapi jika manajemen memori di sisi asli.

Aplikasi Anda sedang mengakses memori di luar ruang alamatnya. Ini kemungkinan besar merupakan akses pointer yang tidak valid. SIGSEGV = kesalahan segmentasi dalam kode asli. Karena itu tidak terjadi dalam kode Java Anda tidak akan melihat jejak tumpukan dengan detail. Namun, Anda mungkin masih melihat beberapa informasi jejak tumpukan di logcat jika Anda melihat-lihat sedikit setelah proses aplikasi crash. Itu tidak akan memberi tahu Anda nomor baris dalam file, tetapi akan memberi tahu Anda file objek dan alamat mana yang digunakan dalam rantai panggilan. Dari sana Anda sering dapat mengetahui area kode yang bermasalah. Anda juga dapat mengatur koneksi asli gdb ke proses target dan menangkapnya di debugger.


Dalam kasus saya itu adalah komponen yang mendasari java.security.MessageDigest tidak aman dan saya mengaksesnya dari 2 utas. (buat hash dan simpan, lalu buat hash dan bandingkan)
garlicman

Anda tidak mendapatkan pengecualian fatal ini karena java.security, MessageDigest atau utas apa pun. Ini mungkin bukan lokasi tepatnya di mana memori sedang rusak. Misalnya, jika Anda merusak tumpukan, sejumlah operasi kemudian dapat dilakukan, dan itu mungkin berada di luar ruang NDK. Anda tidak akan tahu sampai akhir fungsi.
Vivek Bansal

Anggap saja jika kode Anda istirahat di baris 10 di sisi asli, maka bahkan setelah ini, kode Anda akan berjalan dengan baik & setelah menjalankan beberapa baris kode, itu akan membuang kesalahan ini di bagian java. Itu terjadi. + Msgstr "Java akan melempar perkecualian saat kamu bergerak di luar memori". Ya, untungnya, tetapi hanya untuk mengklarifikasi, jika ia melampaui memori dalam C / C ++ dan bergerak ke Jawa, aplikasi dapat macet tanpa membuang pengecualian Java standar. Karena itulah ecxeption fatal akan terjadi.
Vivek Bansal

Cobalah untuk menemukan kesalahan di sisi asli, di mana Anda menggunakan array data apa pun. Dalam kebanyakan kasus, ini akan terjadi dalam array data, ketika secara tidak sengaja Anda melewati batas atau batas data.
Vivek Bansal

24

Hari ini saya menghadapi Fatal signal 11 (SIGSEGV), code 1, fault addr 0x8 in tid 18161masalah dan saya berjuang setengah hari untuk menyelesaikan ini.

Saya mencoba banyak hal membersihkan cache dan menghapus file .gradle dan semuanya.

Akhirnya saya disable Instant Rundan sekarang saya tidak mendapatkan masalah ini lagi. Sekarang aplikasi saya berfungsi setelah mengaktifkan jalankan instan juga. Ini mungkin masalah run instan, Coba dengan menonaktifkan dan mengaktifkan run instan

Dari jawaban ini :

Buka Pengaturan atau Preferensi Android Studio (untuk MAC) -> Build, Execution, Deployment -> Run Instan.

Kemudian hapus centang "Aktifkan Instant Run" di bagian atas.


1
Saya telah menghabiskan setengah hari mencoba menemukan bug yang tidak ada, sampai saya menemukan solusi Anda. Terima kasih banyak, teman!
Kanat

1
Masalah yang sama bagi saya setelah meningkatkan ke Androidx. Saya harus meninggalkan limpahan instan.
JamesD

check off, tetapi sinyal 11 (SIGSEGV), kode 2 (SEGV_ACCERR)
Chego

Halo saya menggunakan android studio 3.5.1 dan saya telah mencoba hampir satu hari untuk memperbaikinya tetapi saya masih memiliki masalah yang sama, saya memiliki google map secara terpisah dan hanya berfungsi pertama kali ketika saya menginstal aplikasi setelah itu setiap kali ketika saya menginstal aplikasi buka aplikasinya beri saya sinyal Fatal 11 (SIGSEGV) di bawah ini, kode 1, addr kesalahan 0xff3a200c di tid 15323 (FinalizerDaemon)
Navin

Dalam kasus Android Studio 3.5 dan di atasnya, Anda perlu menggunakan opsi "Terapkan Perubahan". Cobalah untuk mengaktifkan dan menonaktifkan opsi ini. Ini berhasil untuk saya.
Aanal Mehta

12

Coba nonaktifkan akselerasi perangkat keras Android di manifes Anda.

android:hardwareAccelerated="false"

2
itu bekerja tetapi bukan solusi yang baik sama sekali !! menghentikan semua animasi dan hal
Mohsen

saya memiliki masalah yang sama tetapi tidak bekerja dari sisi saya, saya menggunakan google map secara terpisah dan ketika saya membuka aplikasi itu mengalami crash sinyal Fatal 11 (SIGSEGV), kode 1, addr kesalahan 0x3f000000 dalam tid 16591 (FinalizerDaemon) saya telah mencoba hampir sehari, tetapi tidak menemukan solusi yang tepat untuk ini, itu hanya berfungsi beberapa kali kemudian memberikan kesalahan
Navin

11

Saya mengalami kesalahan ini ketika saya mencoba mengakses 'kanvas' di luar 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

Praktek yang sangat buruk: /


5

Saya mendapatkan kesalahan ini saat menggunakan bitmap seperti ini:

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

Apa yang memperbaiki masalah bagi saya adalah untuk mengurangi ukuran bitmap (> 1000px tinggi hingga 700px).


gunakan sajaBitmapOptions.inSampleSize
FindOut_Quran

4

Saya telah berhadapan dengan SIGSEGV pada Android 4.4.4 (Nexus, Samsungs) Dan ternyata kesalahan fatal dalam penguraian null StringmenggunakanDecimalFormat

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

Pada Android> 21 berhasil ditangani dengan try / catch


3

Saya menghadapi masalah ini beberapa saat yang lalu, setelah bermigrasi dari android.supportke androidx.

Masalahnya adalah renderscript.

Solusi: Saya menghapus dari build.gradledua baris saya:

renderscriptTargetApi 21
renderscriptSupportModeEnabled true

setelah itu pembangunan proyek gagal, karena referensi yang belum terselesaikan:

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

jadi saya mengubahnya menjadi:

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

Setelah itu semua masalah hilang.


2

Jika Anda menggunakan pustaka vitamio dan kesalahan fatal ini terjadi.

Kemudian pastikan bahwa di targetSdkVersion proyek gradle Anda harus kurang dari 23.

Terima kasih.


Solusi Anda berfungsi, Tapi ini bisa menjadi masalah besar karena Play Store dibuat wajib untuk menetapkan targetSdkversion ke> = 26 Agustus 1 dan seterusnya.
Shishir Shetty

2

Dalam kasus saya (saya menggunakan Formulir Xamarin) kesalahan ini dilempar karena kesalahan yang mengikat - misalnya:

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

Pada dasarnya saya menghapus properti model tampilan secara tidak sengaja. Untuk pengembang Xamarin, jika Anda memiliki masalah yang sama, periksa bindings Anda ...


2

Jika Anda telah menambahkan beberapa kode C asli dalam proyek Anda, jawaban ini bisa membantu.

Saya telah menambahkan beberapa kode C asli dalam proyek android.

Sekarang saya mencoba mengakses kode yang mengembalikan string asli kepada saya, sebelum memproses string yang telah saya tetapkan nilai defaultnya sebagai nullptr. Sekarang setelah mengambil nilainya dalam kode java mengalami masalah ini.

Karena kode C asli kami keluar dari direktori java, maka tidak ada petunjuk tentang baris kode yang menyebabkan masalah. Jadi saya akan menyarankan Anda untuk memeriksa file .cpp Anda dan mencoba mencari petunjuk di sana.

Semoga Anda bisa segera menyingkirkan masalah ini. :)


1

Dalam kasus saya, masalah ini disebabkan oleh Android Profiler. Di Android Studio, klik "Android Profiler" dan "akhiri sesi".

Ironisnya, itu juga menyebabkan masalah kinerja ekstrem dalam aplikasi.


1

Tambahkan dua baris ini ke build.gradle Anda di bagian android:

android{
    compileOptions {
            sourceCompatibility 1.8
            targetCompatibility 1.8
        }
}

5
Meskipun kode ini dapat memberikan solusi untuk pertanyaan, lebih baik menambahkan konteks mengapa / cara kerjanya. Ini dapat membantu pengguna di masa depan belajar, dan menerapkan pengetahuan itu ke kode mereka sendiri. Anda juga cenderung mendapat umpan balik positif dari pengguna dalam bentuk upvotes, ketika kode dijelaskan.
borchvm

0

Periksa kode JNI / asli Anda. Salah satu referensi saya adalah nol, tetapi berselang, jadi tidak terlalu jelas.


0

periksa fungsi asli Anda, apakah itu kembali dengan benar atau tidak, Jika tidak dikembalikan, tambahkan pernyataan pengembalian.


0

Bagi saya masalah itu disebabkan oleh pemeran yang buruk antara dua kegiatan. Saya baru-baru ini memindahkan metode ini dari Activity1 ke yang lain 2. Melakukannya, refactor meninggalkan pemeran eksplisit ini seperti sebelumnya. Jadi, bukannya melakukan

((Activity1) mainActivity).hideDialog();

Seharusnya saya lakukan

((Activity2) mainActivity).hideDialog();

Catatan: Tetapi kesalahan ini tidak terjadi pada android 8.0 Saya belum yakin mengapa.

*** Semoga ini bisa membantu.


0

Saya mengalami kesalahan segmentasi ini karena masalah Memori . Struct saya memiliki banyak variabel dan array, memiliki ukuran array 1024 ini.

Mengurangi ukuran menjadi 512, kesalahan hilang.

PS: Ini solusi dan bukan solusi. Perlu untuk menemukan ukuran struct dan alokasi memori dinamis adalah pilihan yang lebih baik.


Saya mengalami masalah yang sama tetapi bekerja secara terbalik. Saya menyimpan hingga 492 data dalam larik saya. Jika saya mengatur ukurannya menjadi 512, kesalahan segfault muncul dan menutup aplikasi saya, ketika saya menambah ukurannya menjadi 1024 itu tidak muncul. Saya mengalami kesulitan memahami cara kerjanya.
malam

0

Saya mendapat kesalahan ini ketika saya menggunakan onDraw()fungsi dalam ViewTreeObserver .

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

Saya memecahkannya dengan menghapus ViewTreeObserver dari onDraw
muzamil

0

Saya memiliki masalah ini dengan paket yang ditambahkan ke aplikasi saya (FancyShowCaseView) dan menyebabkan masalah ini pada pra-lolipop. paket itu ditulis dalam kotlin dan kode utama saya ditulis dalam java. jadi sekarang saya sedang memeriksa versi di pre-lolipop dan jangan biarkan kelasnya dieksekusi. sementara memecahkan masalah. lihat ini jika Anda memiliki masalah yang sama seperti saya


0

Sidik jari build: 'motorola / harpia / harpia: 6.0.1 / MPIS24.241-2.50-16 / 16: kunci pengguna / lepas' Revisi: 'p1b0' ABI: 'arm' pid: 18139, tid: 25935, nama: GLThread 2137 >>> com.portable3d.okt.a3dmap1 <<< sinyal 11 (SIGSEGV), kode 2 (SEGV_ACCERR), penambahan kesalahan 0x7452f000

2 dari 12 ponsel mengembalikan kesalahan, menemukan masalah ada di onDrawFrame (), beberapa objek nol, saya tidak tahu mengapa, saya hanya mengatur

if(gears==null) return;.


0

Saya memiliki masalah ketika saya membuat PDF menggunakan API PDF Android dan saya tidak sengaja menggunakan canvas.save () dan canvas.restore () setelah saya menutup halaman pdf.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.