Signal fatal Android 11 (SIGSEGV) à 0x636f7d89 (code = 1). Comment le retrouver?

221

J'ai lu les autres articles sur la recherche des raisons d'obtenir un SIGSEGVdans une application Android. Je prévois de parcourir mon application pour d'éventuels NullPointers liés à l'utilisation de Canvas, mais mes SIGSEGVbarfs affichent une adresse mémoire différente à chaque fois. De plus, j'ai vu code=1et code=2. Si l'adresse mémoire était 0x00000000, j'aurais une idée qu'il s'agit d'un NullPointer.

Le dernier que j'ai reçu était code=2:

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

Des suggestions sur la façon de suivre cela?

J'ai un suspect, mais je ne souhaite pas encore l'expérimenter. Mon application utilise l'API OSMDroid pour la cartographie hors ligne. La classe OverlayItem représente des marqueurs / nœuds sur la carte. J'ai un service qui collecte des données via le réseau pour remplir l'OverlayItem qui sont ensuite affichées sur la carte. Dans un effort pour simplifier ma conception, j'ai étendu OverlayItem dans ma propre classe NodeOverlayItem, qui comprend certains attributs supplémentaires que j'utilise dans l'activité d'interface utilisateur et dans le service. Cela m'a donné un point d'information unique pour l'interface utilisateur et le service. J'ai utilisé Intents pour diffuser à l'activité pour actualiser la carte d'interface utilisateur lorsque quelque chose a changé. L'activité se lie au service et il existe une méthode de service pour obtenir la liste des NodeOverlayItem. Je pense que cela pourrait être l'utilisation de OverlayItem par l'API OSMDroid, et mon service de mise à jour des informations de nœud en même temps. (un problème de concurrence)

Au moment où j'écris ceci, je pense que c'est vraiment le problème. Le mal de tête ne sépare pas le nœud et OverlayItem de NodeOverlayItem, c'est que l'activité aura besoin de certaines données du nœud, que le service détient. De plus, lorsque l'activité est créée (onResume, etc ...), les objets OverlayItem devront être recréés à partir des données de nœud que le service a conservées pendant que l'activité était absente. Par exemple, vous démarrez l'application, le service collecte des données, l'interface utilisateur l'affiche, vous allez à l'accueil, puis de nouveau à l'application, l'activité devra extraire et recréer les OverlayItem à partir des dernières données de nœud de service.

Je sais que ce n'est pas une grande ou claire question. C'est comme si toutes mes questions de SO étaient niches ou obscures. Si quelqu'un a une suggestion sur la façon d'interpréter ces SIGSEGVerreurs, ce serait grandement apprécié!

MISE À JOUR Voici le dernier crash capturé lors d'une session de débogage. J'ai 3 de ces appareils utilisés pour les tests et ils ne se bloquent pas tous de manière fiable lorsque je développe et teste. J'ai inclus un peu plus pour que la journalisation du GC puisse être notée. Vous pouvez voir que le problème n'est probablement pas lié à l'épuisement de la mémoire.

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
garlicman
la source
Ajoutez plus d'informations du journal sur le plantage.
auselen
J'ai corrigé un bogue comme celui-ci auparavant et je m'attendrais à ce que cela se produise après l'exécution du garbage collector. C'est ça que vous voyez?
Paul Nikonowicz
32
Comment êtes-vous passé d'une ligne à cette trace de pile géante? Je suis bloqué avec la seule ligne et je n'arrive pas à comprendre pourquoi mon application se bloque.
Sean Beach
a fini par étendre tous mes objets avec Java.Lang.Object. Trié mes crashs
Pierre
11
Pour obtenir la trace de la pile entière avec des références d'adresse, arrêtez simplement de filtrer le logcat par votre processus d'application. Il sera juste en dessous de l'erreur SIGSEGV.
alexbchr

Réponses:

166

Tout d'abord, obtenez votre trace de pile tombstone, elle sera imprimée chaque fois que votre application se bloque. Quelque chose comme ça:

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

Ensuite, utilisez l' addr2lineutilitaire (recherchez-le dans votre chaîne d'outils NDK) pour trouver la fonction qui se bloque. Dans cet exemple, vous faites

addr2line -e -f libc.so 0001173c

Et vous verrez d'où vous venez le problème. Bien sûr, cela ne vous aidera pas car il est en libc.

Vous pouvez donc combiner les utilitaires de arm-eabi-objdumppour trouver la cible finale.

Croyez-moi, c'est une tâche difficile.




Juste pour une mise à jour. Je pense que je faisais la construction native d'Android à partir de l'arborescence source entière depuis assez longtemps, jusqu'à aujourd'hui, j'ai moi-même lu attentivement les documents NDK. Depuis la sortie de NDK-r6, il a fourni un utilitaire appelé ndk-stack.

Voici le contenu des documents officiels du NDK avec la balle de goudron NDK-r9.

Aperçu:

ndk-stack est un outil simple qui vous permet de filtrer les traces de pile telles qu'elles apparaissent dans la sortie de 'adb logcat' et de remplacer n'importe quelle adresse à l'intérieur d'une bibliothèque partagée par les valeurs: correspondantes.

En un mot, cela se traduira par quelque chose comme:

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

Dans la sortie la plus lisible:

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

Usage:

Pour ce faire, vous aurez d'abord besoin d'un répertoire contenant des versions symboliques des bibliothèques partagées de votre application. Si vous utilisez le système de construction NDK (c.-à-d. ndk-build), Ceux-ci sont toujours situés sous $ PROJECT_PATH / obj / local /, où correspond à l'ABI de votre appareil (c.- armeabià- d. Par défaut).

Vous pouvez alimenter le logcattexte en entrée directe dans le programme, par exemple:

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

Ou vous pouvez utiliser l'option -dump pour spécifier le logcat comme fichier d'entrée, par exemple:

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

IMPORTANT:

L'outil recherche la ligne initiale contenant les départs dans la logcatsortie, c'est-à-dire quelque chose qui ressemble à:

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

Lorsque vous copiez / collez des traces, n'oubliez pas cette ligne des traces, ou ndk-stackcela ne fonctionnera pas correctement.

FAIRE:

Une future version de ndk-stackva essayer de se lancer adb logcatet de sélectionner automatiquement le chemin de la bibliothèque. Pour l'instant, vous devrez effectuer ces étapes manuellement.

Pour l'instant, ndk-stackne gère pas les bibliothèques qui ne contiennent pas d'informations de débogage. Il peut être utile d'essayer de détecter le point d'entrée de fonction le plus proche d'une adresse PC donnée (par exemple, comme dans l'exemple libc.so ci-dessus).

Robin
la source
7
Désolé Robin. J'apprécie la réponse. Si j'avais posté mon vidage sur incident, ce que j'ai fait dans une autre question à ce sujet en particulier, vous auriez pu répondre en contexte. Cependant, j'ai décidé de vous donner les 100 primes (de mon précieux représentant!), Car vous étiez le seul au monde à avoir tenté de retracer la panne jusqu'à la source de la bibliothèque native.
garlicman
1
Salut Robin. merci beaucoup pour une réponse détaillée et informative. Je me demandais s'il est possible d'imprimer les informations à l'intérieur des bibliothèques natives. Mes bibliothèques natives ont beaucoup d'informations de débogage que j'ai imprimées en utilisant printf. Puis-je voir la sortie de cela à printfpartir des bibliothèques natives.
Saad Saadi
#include <android / Log.h> #define LOGD (...) android_log_print (ANDROID_LOG_DEBUG, "YOURTAG", __ VA_ARGS )
Robin
vous venez de me sauver des jours de débogage avec cette commande ndk-stack! Je ne comprends vraiment pas pourquoi je ne l'ai pas trouvé avant ...
Traian
ok j'ai imprimé le vidage sur incident mais je ne comprends toujours pas la sortie.
Hilal
48

D'ACCORD! Je suis vraiment désolé pour ceux qui ont soumis des commentaires et des réponses, mais j'ai trouvé le problème. Je ne pense pas que cela aidera beaucoup d'autres à essayer de retrouver leur SIGSEGV personnel, mais le mien (et c'était très difficile) était entièrement lié à cela:

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

Le libcrypto.so dans mon vidage m'a un peu renseigné. Je fais un hachage MD5 des données de paquet en essayant de déterminer si j'ai déjà vu le paquet et en le sautant si je l'avais. J'ai pensé à un moment donné qu'il s'agissait d'un vilain problème de thread lié au suivi de ces hachages, mais il s'est avéré que c'était la classe java.security.MessageDigest! Ce n'est pas sûr pour les threads!

Je l'ai échangé avec un UID que je remplissais dans chaque paquet en fonction de l'UUID de l'appareil et d'un horodatage. Aucun problème depuis.

Je suppose que la leçon que je peux donner à ceux qui étaient dans ma situation est, même si vous êtes une application 100% Java, faites attention à la bibliothèque native et au symbole noté dans le vidage sur incident pour les indices. Googler pour SIGSEGV + le nom lib .so ira beaucoup plus loin que le code inutile = 1, etc ... Réfléchissez ensuite à l'endroit où votre application Java pourrait toucher le code natif, même si vous ne faites rien. J'ai fait l'erreur de supposer qu'il s'agissait d'un problème de threading Service + UI où le canevas dessinait quelque chose de nul (le cas le plus courant que j'ai recherché sur SIGSEGV) et ignoré la possibilité qu'il puisse être complètement lié au code que j'ai écrit qui était lié à la lib .so dans le vidage sur incident. Naturellement, java.security utiliserait un composant natif dans libcrypto.so pour la vitesse, donc une fois que j'ai compris, j'ai cherché sur Android + SIGSEGV + libcrypto. donc et a trouvé le problème documenté. Bonne chance!

garlicman
la source
1
Vous avez un problème similaire, toujours avec MessageDigest, ok, pas sûr du tout. Au lieu d'une belle exception, nous obtenons un vilain crash!
Bamaco
J'ai eu une chose similaire avec le décryptage RSA en utilisant OpenSSL. Le déplacement de l'opération dans un nouveau thread a résolu le problème.
peceps
41

J'obtenais cette erreur en enregistrant un objet dans les préférences partagées en tant que chaîne convertie gson. La chaîne gson n'était pas bonne, donc la récupération et la désérialisation de l'objet ne fonctionnaient pas correctement. Cela signifiait que tout accès ultérieur à l'objet entraînait cette erreur. Effrayant :)

Daniel Wilson
la source
6
Merci, cela vient de me sauver la vie :))) Vous obtiendrez ceci si l'objet que gson essaie de convertir n'a pas de constructeur valide (je l'essayais avec la classe android.Location, donnant cette erreur)
rosu alin
5
@rosualin Oh mon dieu! C'est peut-être exactement mon problème (arracher mes cheveux ici). Je stocke trop l' android.Locationobjet SharedPreferencesdans un fichier WakefulBroadcastReceiver. La plupart du temps ça marche mais parfois j'obtiens le SIGSEGVcrash redouté . Pouvez-vous s'il vous plaît partager comment vous l'avez résolu?
camelCaseCoder
3
Eh bien, j'essayais d'enregistrer android.Location ou Geofence dans les préférences partagées, et n'ayant pas de constructeur, cela provoquerait cela. J'ai donc fait un cours personnalisé, avec les données dont j'avais besoin et je les ai juste enregistrées. J'espère que ça aide.
rosu alin
3
@rosualin Cela a fonctionné !!!!!!!!!!! Tu es un sauveur!!! Je devenais fou de ce stupide bug depuis 4 jours. Merci beaucoup!!!!
camelCaseCoder
1
Heureux d'avoir pu aider: D
rosu alin
30

J'ai également eu cette erreur plusieurs fois et je l'ai résolue. Cette erreur sera rencontrée en cas de gestion de la mémoire en natif.

Votre application accède à la mémoire en dehors de son espace d'adressage. Il s'agit très probablement d'un accès de pointeur non valide. SIGSEGV = défaut de segmentation dans le code natif. Comme il ne se produit pas dans le code Java, vous ne verrez pas de trace de pile avec des détails. Cependant, vous pouvez toujours voir des informations de trace de pile dans le logcat si vous regardez un peu après le blocage du processus d'application. Il ne vous indiquera pas le numéro de ligne dans le fichier, mais vous indiquera quels fichiers objets et adresses étaient utilisés dans la chaîne d'appel. De là, vous pouvez souvent déterminer quelle zone du code est problématique. Vous pouvez également configurer une connexion native gdb au processus cible et l'attraper dans le débogueur.

Vivek Bansal
la source
Dans mon cas, c'était que le composant sous-jacent de java.security.MessageDigest n'était pas sûr pour les threads et j'y accédais à partir de 2 threads. (créer le hachage et stocker, puis créer le hachage et comparer)
garlicman
Vous n'obtenez pas cette exception fatale en raison de java.security, MessageDigest ou de tout autre thread. Il peut ne pas s'agir de l'emplacement exact où la mémoire est corrompue. Par exemple, si vous corrompez le tas, un certain nombre d'opérations plus tard peuvent être effectuées, et cela pourrait bien être en dehors de l'espace NDK. Vous ne saurez pas avant la fin de la fonction.
Vivek Bansal du
Supposons simplement que si votre code se casse dans la ligne 10 du côté natif, alors même après cela, votre code fonctionnera correctement et après avoir exécuté certaines lignes de code, il générera cette erreur dans la partie java. Ça arrive. "Java lèvera des exceptions lorsque vous vous déplacerez hors de la mémoire". Oui, heureusement, mais juste pour clarifier, s'il dépasse la mémoire en C / C ++ et qu'il passe à Java, l'application peut se bloquer sans lever d'exception Java standard. C'est pourquoi une ecxeption fatale se produira.
Vivek Bansal
Essayez de trouver une erreur dans le côté natif, où vous avez utilisé n'importe quel tableau de données. Dans la plupart des cas, cela se produit dans les tableaux de données, lorsque par erreur vous franchissez ses limites ou sa limite de données.
Vivek Bansal
24

Aujourd'hui, j'ai fait face à un Fatal signal 11 (SIGSEGV), code 1, fault addr 0x8 in tid 18161problème et je lutte une demi-journée pour le résoudre.

J'ai essayé beaucoup de choses en effaçant le cache et en supprimant le fichier .gradle et tout.

Enfin, je disable Instant Runne reçois plus ce problème maintenant. Maintenant, mon application fonctionne également après avoir activé l'exécution instantanée. Cela peut être le problème de l'exécution instantanée, essayez de désactiver et d'activer l'exécution instantanée

De cette réponse:

Accédez aux paramètres ou préférences d'Android Studio (pour MAC) -> Build, Execution, Deployment -> Instant Run.

Désélectionnez ensuite la case "Activer l'exécution instantanée" en haut.

Naveen Kumar M
la source
1
J'ai passé une demi-journée à essayer de trouver ce bug inexistant, jusqu'à ce que je trouve votre solution. Merci beaucoup, mec!
Kanat
1
Même problème pour moi après la mise à niveau vers androidx. Je dois laisser couler instantanément.
JamesD
cochez, mais signalez 11 (SIGSEGV), code 2 (SEGV_ACCERR)
Chego
Bonjour, j'utilise Android Studio 3.5.1 et j'avais essayé presque un jour pour le réparer, mais j'ai toujours le même problème, j'ai une carte Google en fragments et cela ne fonctionne que la première fois lorsque j'installe l'application après cela à chaque fois que je application ouverte, il me donne un signal Fatal 11 inférieur (SIGSEGV), code 1, addr d'erreur 0xff3a200c dans tid 15323 (FinalizerDaemon)
Navin
Dans le cas d'Android Studio 3.5 et supérieur, vous devez utiliser l'option "Appliquer les modifications". Essayez d'activer et de désactiver cette option. Ça a marché pour moi.
Aanal Mehta
12

Essayez de désactiver l'accélération matérielle Android dans votre manifeste.

android:hardwareAccelerated="false"
BYISHIMO Audace
la source
2
ça marche mais pas une bonne solution du tout !! arrête toutes les animations et les choses graphiques
Mohsen
j'ai le même problème mais ne fonctionnait pas de mon côté, j'ai utilisé google map en fragment et lorsque j'ouvre l'application, il s'est écrasé. presque un jour, mais n'a pas trouvé la bonne solution pour cela, cela ne fonctionne que quelques fois, puis il donne une erreur
Navin
11

J'ai rencontré cette erreur lorsque j'ai essayé d'accéder au «canevas» en dehors de 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

Une très mauvaise pratique: /

Prabs
la source
5

J'obtenais cette erreur lors de l'utilisation d'un bitmap comme celui-ci:

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

Ce qui a résolu le problème pour moi, c'était de réduire la taille du bitmap (> 1000 pixels de haut à 700 pixels).

David Walton
la source
utilisez simplement à la placeBitmapOptions.inSampleSize
FindOut_Quran
4

J'ai rencontré SIGSEGV sur Android 4.4.4 (Nexuses, Samsung) Et il s'est avéré qu'une erreur fatale était en analysant en null StringutilisantDecimalFormat

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

Sur Android> 21, il a été géré avec succès avec try / catch

Yazazzello
la source
3

J'ai rencontré ce problème il y a un instant, après avoir migré de android.supportvers androidx.

Le problème était renderscript.

Solution: j'ai supprimé de mes build.gradledeux lignes:

renderscriptTargetApi 21
renderscriptSupportModeEnabled true

après l'échec de la construction du projet, en raison de références non résolues:

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

donc je les ai changés en:

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

Après cela, tous les problèmes ont disparu.

Cililing
la source
2

Si vous utilisez la bibliothèque Vitamio et que cette erreur fatale se produit.

Assurez-vous ensuite que dans votre projet gradle, targetSdkVersion doit être inférieur à 23.

Merci.

mehmoodnisar125
la source
Votre solution fonctionne, mais cela pourrait être un problème majeur car le Play Store a rendu obligatoire de définir targetSdkversion sur> = 26 août à partir de maintenant.
Shishir Shetty
2

Dans mon cas (j'utilise Xamarin Forms), cette erreur a été générée en raison d'une erreur de liaison - par exemple:

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

Fondamentalement, j'ai supprimé la propriété du modèle de vue par erreur. Pour les développeurs Xamarin, si vous avez le même problème, vérifiez vos liaisons ...

Dragos Stoica
la source
2

Si vous aviez ajouté du code C natif dans votre projet, cette réponse pourrait être utile.

J'avais ajouté du code C natif dans un projet Android.

Maintenant, j'essayais d'accéder à ce code qui me renvoyait une chaîne native, avant de traiter la chaîne, j'avais défini sa valeur par défaut comme nullptr. Maintenant, lors de la récupération de sa valeur dans le code java, ce problème est survenu.

Comme notre code C natif est sorti du répertoire java, nous n'avons donc aucune idée de la ligne de code exacte qui crée le problème. Je vous suggère donc de vérifier votre fichier .cpp et d'essayer d'y trouver des indices.

J'espère que vous vous débarrasserez bientôt du problème. :)

Ali Nawaz
la source
1

Dans mon cas, le problème était dû à Android Profiler. Dans Android Studio, cliquez sur "Android Profiler" et "fin de session".

Ironiquement, cela causait également des problèmes de performances extrêmes dans l'application.

Tomacco
la source
1

Ajoutez ces deux lignes à votre build.gradle dans la section Android:

android{
    compileOptions {
            sourceCompatibility 1.8
            targetCompatibility 1.8
        }
}
M.Chithirai Perumal
la source
5
Bien que ce code puisse fournir une solution à la question, il est préférable d'ajouter du contexte pour expliquer pourquoi / comment cela fonctionne. Cela peut aider les futurs utilisateurs à apprendre et à appliquer ces connaissances à leur propre code. Vous êtes également susceptible d'avoir des commentaires positifs des utilisateurs sous la forme de votes positifs, lorsque le code est expliqué.
borchvm
0

Vérifiez votre code JNI / natif. Une de mes références était nulle, mais elle était intermittente, donc ce n'était pas très évident.

zMan
la source
0

vérifiez vos fonctions natives, qu'elles retournent correctement ou non, si elles ne sont pas retournées, veuillez ajouter des instructions de retour.

Jeyanth
la source
0

Pour moi, ce problème était dû à un mauvais casting entre deux activités. J'ai récemment déplacé cette méthode de Activity1 vers une autre 2. Ce faisant, le refactor a laissé cette distribution explicite telle qu'elle était auparavant. Donc au lieu de faire

((Activity1) mainActivity).hideDialog();

Je devais faire

((Activity2) mainActivity).hideDialog();

Remarque: Mais cette erreur ne s'est pas produite sur Android 8.0, je ne sais pas encore pourquoi.

*** J'espère que ça aide.

Gomez NL
la source
0

J'ai eu cette erreur de segmentation en raison de problèmes de mémoire . Ma structure ayant de nombreuses variables et tableaux, avait ce tableau de taille 1024.

En réduisant la taille à 512, l'erreur a disparu.

PS: Il s'agit d'une solution de contournement et non d'une solution. Il est nécessaire de trouver la taille de la structure et l'allocation dynamique de la mémoire est une meilleure option.

Shachi
la source
J'ai le même problème, mais cela fonctionne à l'envers. Je stocke jusqu'à 492 données dans ma baie. Si je fixe la taille à 512, l'erreur de segmentation apparaît et ferme mon application, lorsque j'augmente la taille à 1024, elle n'apparaît pas. J'ai du mal à comprendre comment cela fonctionne.
wEight
0

J'ai eu cette erreur lorsque j'ai utilisé ViewTreeObserver dans la onDraw()fonction.

@Override
protected void onDraw(Canvas canvas) {
    // super.onDraw(canvas);
    ViewTreeObserver vto = mTextView.getViewTreeObserver();
    vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            // some animation        
        }
    });
 }
muzamil
la source
Je l'ai résolu en supprimant ViewTreeObserver d'onDraw
muzamil
0

J'ai eu ce problème avec un package qui a été ajouté à mon application (FancyShowCaseView) et j'ai provoqué ce problème sur pré-lolipop. ce paquet a été écrit en kotlin et mes principaux codes ont été écrits en java. alors maintenant je vérifie la version dans pré-lolipop et ne laisse pas sa classe être exécutée. temporaire résolu le problème. vérifiez ceci si vous avez un problème similaire comme moi

Hossein Karami
la source
0

Création d'empreintes digitales: 'motorola / harpia / harpia: 6.0.1 / MPIS24.241-2.50-16 / 16: utilisateur / touches de libération' Révision: 'p1b0' ABI: 'arm' pid: 18139, tid: 25935, nom: GLThread 2137 >>> com.portable3d.okt.a3dmap1 <<< signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), erreur addr 0x7452f000

2 téléphones sur 12 ont renvoyé une erreur, ont trouvé le problème dans onDrawFrame (), certains objets étaient nuls, je ne sais pas pourquoi, je viens de définir

if(gears==null) return;.

Chego
la source
0

J'ai eu le problème lorsque je créais un PDF à l'aide des API PDF d'Android et j'ai accidentellement utilisé canvas.save () et canvas.restore () après avoir fermé une page pdf.

Abdollah Ebadi
la source