Android Fatal signal 11 (SIGSEGV) o wartości 0x636f7d89 (kod = 1). Jak można to wyśledzić?


221

Czytałem inne posty na temat śledzenia przyczyn uzyskania SIGSEGVaplikacji na Androida. Planuję przeszukać moją aplikację pod kątem możliwych NullPointers związanych z użyciem Canvas, ale moje SIGSEGVbarfs za każdym razem wyszukują inny adres pamięci. Plus widziałem code=1i code=2. Gdyby to był adres pamięci 0x00000000, miałbym wskazówkę, że to NullPointer.

Ostatni, który dostałem to code=2:

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

Wszelkie sugestie, jak to wyśledzić?

Mam podejrzanego, ale jeszcze nie chcę z nim eksperymentować. Moja aplikacja korzysta z OSMDroid API do mapowania offline. Klasa OverlayItem reprezentuje znaczniki / węzły na mapie. Mam usługę, która zbiera dane przez sieć w celu wypełnienia elementu OverlayItem, które są następnie wyświetlane na mapie. W celu uproszczenia projektu rozszerzyłem OverlayItem do własnej klasy NodeOverlayItem, która zawiera pewne dodatkowe atrybuty, których używam w działaniu interfejsu użytkownika i w usłudze. To dało mi jeden punkt informacji o produkcie dla interfejsu użytkownika i usługi. Użyłem Intentów do transmisji do działania w celu odświeżenia mapy interfejsu użytkownika, gdy coś się zmieniło. Działanie wiąże się z usługą i istnieje metoda usługi, aby uzyskać listę NodeOverlayItem. Myślę, że może to być użycie OverlayItem interfejsu API OSMDroid, a moja usługa jednocześnie aktualizuje informacje o węźle. (problem współbieżności)

Pisząc to, myślę, że to naprawdę problem. Ból głowy nie rozdziela węzła i obiektu OverlayItem od obiektu NodeOverlayItem, dlatego, że działanie będzie wymagało danych z węzła przechowywanych przez usługę. Ponadto po utworzeniu działania (onResume itp.) Obiekty OverlayItem będą musiały zostać ponownie utworzone na podstawie danych węzła utrzymywanych przez usługę podczas nieobecności działania. np. uruchamiasz aplikację, usługa zbiera dane, interfejs użytkownika wyświetla je, idziesz do strony głównej, a następnie z powrotem do aplikacji, działanie będzie musiało pobrać i ponownie utworzyć obiekty OverlayItem z najnowszych danych węzła usługi.

Wiem, że to nie są świetne ani jasne pytania. To tak, jakby wszystkie moje pytania SO były niszowe lub niejasne. Jeśli ktoś ma sugestie dotyczące interpretacji tych SIGSEGVbłędów, byłoby to bardzo mile widziane!

AKTUALIZACJA Oto najnowsza awaria zarejestrowana podczas sesji debugowania. Mam 3 z tych urządzeń używanych do testowania i nie wszystkie ulegają awarii w sposób niezawodny podczas programowania i testowania. Dodałem trochę więcej, aby można było odnotować rejestrowanie GC. Widać, że problem prawdopodobnie nie jest związany z wyczerpaniem pamięci.

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

Dodaj więcej informacji z dziennika o awarii.
auselen,

Naprawiłem już taki błąd i spodziewam się, że tak się stanie po uruchomieniu śmieciarza. Czy to właśnie widzisz?
Paul Nikonowicz

32
Jak przeszedłeś od jednej linii do śladu gigantycznego stosu? Utknąłem w jednej linii i nie mogę zrozumieć, dlaczego moja aplikacja ulega awarii.
Sean Beach

skończyło się rozszerzaniem wszystkich moich obiektów Java.Lang.Object. Rozwiązałem moje awarie
Pierre

11
Aby uzyskać śledzenie całego stosu z odniesieniami do adresu, po prostu przestań filtrować logcat według procesu aplikacji. Będzie tuż poniżej błędu SIGSEGV.
alexbchr,

Odpowiedzi:


166

Najpierw uzyskaj ślad stosu nagrobków, który będzie drukowany za każdym razem, gdy nastąpi awaria aplikacji. Coś takiego:

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

Następnie użyj addr2linenarzędzia (znajdź je w łańcuchu narzędzi NDK), aby znaleźć funkcję, która ulega awarii. W tym przykładzie robisz

addr2line -e -f libc.so 0001173c

I zobaczysz, gdzie masz problem. Oczywiście to ci nie pomoże, ponieważ jest w libc.

Możesz więc połączyć narzędzia arm-eabi-objdumpdo znalezienia ostatecznego celu.

Uwierz mi, to trudne zadanie.




Tylko do aktualizacji. Wydaje mi się, że dość długo robiłem natywną kompilację Androida z drzewa całego źródła, aż do dziś uważnie czytam dokumenty NDK. Od czasu wydania NDK-r6 udostępnia narzędzie o nazwie ndk-stack.

Poniżej znajduje się treść oficjalnych dokumentów NDK z piłką smołową NDK-r9.

Przegląd:

ndk-stack jest prostym narzędziem, które pozwala filtrować ślady stosu, które pojawiają się na wyjściu „adb logcat” i zastępować dowolny adres w bibliotece współdzielonej odpowiednimi: wartościami.

Krótko mówiąc, przetłumaczy coś w stylu:

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

W bardziej czytelny wynik:

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

Stosowanie:

Aby to zrobić, najpierw potrzebujesz katalogu zawierającego symboliczne wersje bibliotek współdzielonych aplikacji. Jeśli używasz systemu kompilacji NDK (tj. ndk-build), To zawsze znajdują się one pod $ PROJECT_PATH / obj / local /, gdzie oznacza ABI twojego urządzenia (tj. armeabiDomyślnie).

Możesz podać logcattekst jako bezpośrednie wejście do programu, np .:

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

Lub możesz użyć opcji -dump, aby określić logcat jako plik wejściowy, np .:

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

WAŻNE:

Narzędzie szuka początkowej linii zawierającej początki w danych logcatwyjściowych, tj. Czegoś, co wygląda następująco:

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

Podczas kopiowania / wklejania śladów nie zapomnij o tym wierszu ze śladów, ndk-stackponieważ nie będzie działał poprawnie.

DO ZROBIENIA:

Przyszła wersja ndk-stackspróbuje automatycznie uruchomić adb logcati wybrać ścieżkę biblioteki. Na razie musisz wykonać te czynności ręcznie.

Na razie ndk-stacknie obsługuje bibliotek, które nie zawierają informacji debugowania. Przydatna może być próba wykrycia najbliższego punktu wejścia funkcji do danego adresu PC (np. Jak w powyższym przykładzie libc.so).


7
Przepraszam Robin. Doceniam odpowiedź. Gdybym opublikował zrzut awaryjny, co zrobiłem w innym pytaniu na ten temat, być może byłbyś w stanie odpowiedzieć w kontekście. Jednak postanowiłem dać ci 100 nagród (mojego cennego przedstawiciela!), Ponieważ byłeś jedynym, który próbował rozwiązać problem awarii z powrotem do natywnego źródła biblioteki.
czosnek

1
Cześć Robin. bardzo dziękuję za szczegółową i pouczającą odpowiedź. Zastanawiałem się, czy można wydrukować informacje w natywnych bibliotekach. Moje rodzime biblioteki zawierają wiele informacji o debugowaniu, które wydrukowałem printf. Czy mogę zobaczyć wynik tego printfz bibliotek natywnych.
Saad Saadi,

#include <android / Log.h> # zdefiniować LOGD (...) android_log_print (ANDROID_LOG_DEBUG, „YOURTAG”, __ VA_ARGS )
Robin

właśnie zaoszczędziłeś mi dni debugowania za pomocą tego polecenia ndk-stack! Naprawdę nie rozumiem, dlaczego nie znalazłem tego wcześniej ...
Traian

ok, wydrukowałem zrzut awaryjny, ale nadal nie rozumiem wyniku.
Hilal

48

DOBRZE! Bardzo przepraszam tych, którzy faktycznie przesłali komentarze i odpowiedzi, ale znalazłem problem. Nie sądzę, żeby to pomogło wielu innym próbującym wyśledzić swój osobisty SIGSEGV, ale mój (i to było bardzo trudne) był całkowicie z tym związany:

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

Biblioteka libcrypto.so w moim zrzutu zlepiła mnie. Robię skrót danych pakietu MD5, próbując ustalić, czy już widziałem pakiet, i pomijam go, gdybym miał. W pewnym momencie pomyślałem, że to brzydki wątek związany ze śledzeniem tych skrótów, ale okazało się, że była to klasa java.security.MessageDigest! To nie jest bezpieczne dla wątków!

Wymieniłem go z UID, który umieszczałem w każdym pakiecie na podstawie UUID urządzenia i znacznika czasu. Od tamtej pory nie ma problemów.

Myślę, że lekcją, którą mogę przekazać tym, którzy byli w mojej sytuacji, jest to, że nawet jeśli jesteś w 100% aplikacją Java, zwróć uwagę na rodzimą bibliotekę i symbol zanotowany w zrzutu awaryjnym po wskazówki. Googling dla SIGSEGV + nazwa lib .so pójdzie o wiele dalej niż bezużyteczny kod = 1 itd. ... Następnie zastanów się, gdzie Twoja aplikacja Java może dotykać kodu natywnego, nawet jeśli nic nie robisz. Popełniłem błąd, zakładając, że jest to problem z wątkami w interfejsie Service + UI, w którym Canvas rysuje coś, co jest zerowe (najczęstszy przypadek, w którym korzystałem z Google na SIGSEGV) i zignorowałem możliwość, że mogło to być całkowicie związane z kodem, który napisałem. związane z lib .so w zrzutu awaryjnym. Oczywiście java.security użyłby natywnego komponentu w libcrypto.so dla szybkości, więc kiedy się połączyłem, przejrzałem Google na Androida + SIGSEGV + libcrypto. i znalazłem udokumentowany problem. Powodzenia!


1
Mam podobny problem, nadal z MessageDigest, ok, wcale nie jest bezpieczny dla wątków. Zamiast miłego wyjątku mamy brzydką awarię!
Bamaco

Miałem podobne rzeczy z deszyfrowaniem RSA przy użyciu openssl. Przeniesienie operacji w nowym wątku rozwiązało problem.
Peceps

41

Wystąpił ten błąd, zapisując obiekt we wspólnych preferencjach jako ciąg przekonwertowany przez gson. Ciąg gson nie był dobry, więc pobieranie i deserializowanie obiektu nie działało właściwie. Oznaczało to, że każde kolejne dostęp do obiektu spowodowało błąd. Straszny :)


6
Dzięki, właśnie uratowało mi to życie :))) Dostaniesz to, jeśli obiekt, który gson próbuje przekonwertować, nie ma poprawnego konstruktora (próbowałem tego z klasą android.Location, podając ten błąd)
rosu alin

5
@rosualin O mój boże! To może być dokładnie mój problem (wyciąganie tutaj włosów). Jestem zbyt przechowywania android.Locationobiektu w SharedPreferencesw sposób WakefulBroadcastReceiver. Przez większość czasu to działa, ale czasami mam straszną SIGSEGVawarię. Czy możesz opowiedzieć, jak to rozwiązałeś?
camelCaseCoder,

3
Cóż, próbowałem zapisać androida. Lokalizacja lub Geofence we wspólnych preferencjach, a nie mając konstruktora, to by to spowodowało. Zrobiłem więc niestandardową klasę z danymi, których potrzebowałem i właśnie to zapisałem. Mam nadzieję, że to pomoże.
rosu alin

3
@rosualin To działało !!!!!!!!!!! Jesteś ratownikiem życia !!! Przez ostatnie 4 dni oszalałem na punkcie tego głupiego robaka. Dziękuję bardzo!!!!
camelCaseCoder,

1
Cieszę się, że mogłem pomóc: D
rosu alin

30

Ten błąd również występował wiele razy i go rozwiązałem. Ten błąd pojawi się w przypadku zarządzania pamięcią po stronie natywnej.

Twoja aplikacja uzyskuje dostęp do pamięci poza swoją przestrzenią adresową. Najprawdopodobniej jest to nieprawidłowy dostęp do wskaźnika. SIGSEGV = błąd segmentacji w kodzie natywnym. Ponieważ nie występuje w kodzie Java, nie zobaczysz śladu stosu ze szczegółami. Jednak nadal możesz zobaczyć pewne informacje śledzenia stosu w logcat, jeśli rozejrzysz się trochę po awarii procesu aplikacji. Nie powie ci numer linii w pliku, ale powie ci, które pliki obiektów i adresy były używane w łańcuchu połączeń. Stamtąd często można dowiedzieć się, który obszar kodu jest problematyczny. Możesz także skonfigurować natywne połączenie gdb z procesem docelowym i złapać je w debuggerze.


W moim przypadku było to, że podstawowy komponent java.security.MessageDigest nie był bezpieczny dla wątków i uzyskiwałem do niego dostęp z 2 wątków. (utwórz skrót i zapisz, a następnie utwórz skrót i porównaj)
czosnek

Twój wyjątek krytyczny nie pojawia się z powodu java.security, MessageDigest lub dowolnego wątku. To może nie być dokładna lokalizacja, w której pamięć ulega uszkodzeniu. Np. Jeśli uszkodzisz stertę, później może zostać wykonana dowolna liczba operacji i może ona znajdować się poza przestrzenią NDK. Nie dowiesz się do końca funkcji.
Vivek Bansal,

Przypuśćmy, że jeśli twój kod złamie się w linii 10 po stronie natywnej, to nawet po tym kod będzie działał poprawnie i po wykonaniu niektórych linii kodu, wyrzuci ten błąd w części Java. Zdarza się. „Java wyrzuci wyjątki, gdy wyjdziesz poza pamięć”. Tak, na szczęście, ale dla wyjaśnienia, jeśli przeskoczy pamięć w C / C ++ i przejdzie do Javy, aplikacja może ulec awarii bez zgłaszania standardowego wyjątku Java. Właśnie dlatego nastąpi fatalna ekscepcja.
Vivek Bansal,

Spróbuj znaleźć błąd po stronie natywnej, gdzie użyłeś dowolnej tablicy danych. W większości przypadków nastąpi to w tablicach danych, gdy przez pomyłkę przekroczysz granice lub limit danych.
Vivek Bansal,

24

Dzisiaj stanąłem przed Fatal signal 11 (SIGSEGV), code 1, fault addr 0x8 in tid 18161problemem i przez pół dnia staram się go rozwiązać.

Próbowałem wielu rzeczy, czyszcząc pamięć podręczną i usuwając plik .gradle i wszystko.

Wreszcie ja disable Instant Runi teraz nie otrzymuję tego problemu ponownie. Teraz moja aplikacja działa również po włączeniu natychmiastowego uruchomienia. Może to być problem z natychmiastowym uruchomieniem. Spróbuj wyłączyć lub włączyć natychmiastowe uruchomienie

Z tej odpowiedzi:

Przejdź do Ustawień lub preferencji Android Studio (dla MAC) -> Kompilacja, wykonanie, wdrożenie -> Natychmiastowe uruchomienie.

Następnie usuń zaznaczenie pola wyboru „Włącz natychmiastowe uruchamianie” u góry.


1
Spędziłem pół dnia, próbując znaleźć ten nieistniejący błąd, dopóki nie znalazłem twojego rozwiązania. Dziękuję bardzo, stary!
Kanat

1
Ten sam problem dla mnie po uaktualnieniu do systemu Androidx. Muszę zostawić natychmiastowy bieg.
JamesD

sprawdź, ale sygnał 11 (SIGSEGV), kod 2 (SEGV_ACCERR)
Chego

Witam, korzystam z Androida Studio 3.5.1 i próbowałem go naprawić prawie cały dzień, ale nadal mam ten sam problem, mam fragment mapy Google i działa ona tylko za pierwszym razem, gdy instaluję aplikację, za każdym razem, gdy otwórz aplikację, daj mi poniżej Sygnał krytyczny 11 (SIGSEGV), kod 1, adres błędu 0xff3a200c w tid 15323 (FinalizerDaemon)
Navin

W przypadku Androida Studio 3.5 i nowszych musisz użyć opcji „Zastosuj zmiany”. Spróbuj włączyć i wyłączyć tę opcję. To zadziałało dla mnie.
Aanal Mehta

12

Spróbuj wyłączyć akcelerację sprzętową Androida w swoim manifeście.

android:hardwareAccelerated="false"

2
to działa, ale wcale nie jest dobrym rozwiązaniem !! zatrzymuje wszystkie animacje i elementy graficzne
Mohsen

mam ten sam problem, ale nie działał z mojej strony, użyłem mapy google w fragmencie, a kiedy otwieram aplikację, rozbił się Sygnał krytyczny 11 (SIGSEGV), kod 1, adres błędu 0x3f000000 w tid 16591 (FinalizerDaemon) próbowałem prawie dzień, ale nie znalazłem odpowiedniego rozwiązania, działa tylko kilka razy, a następnie wyświetla błąd
Navin

11

Wystąpił ten błąd, gdy próbowałem uzyskać dostęp do „obszaru roboczego” poza 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

Bardzo zła praktyka: /


5

Podczas używania takiej mapy bitowej pojawiał się ten błąd:

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

Tym, co rozwiązało problem, było zmniejszenie rozmiaru mapy bitowej (> 1000px high do 700px).


wystarczy użyć zamiast tegoBitmapOptions.inSampleSize
FindOut_Quran

4

Mam do czynienia z SIGSEGV na Androidzie 4.4.4 (Nexuses, Samsungs). Okazało się, że błąd krytyczny polegał na analizie null Stringprzy użyciuDecimalFormat

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

W Androidzie> 21 został pomyślnie obsłużony za pomocą try / catch


3

I wobec tej chwili kwestia temu, po migracji od android.supportcelu androidx.

Problem polegał na tym renderscript.

Rozwiązanie: usunąłem z build.gradletych dwóch wierszy:

renderscriptTargetApi 21
renderscriptSupportModeEnabled true

po niepowodzeniu budowania tego projektu z powodu nierozwiązanych odniesień:

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

więc zmieniłem je na:

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

Po tym wszystkie problemy zniknęły.


2

Jeśli używasz biblioteki vitamio i występuje ten błąd krytyczny.

Następnie upewnij się, że w twoim projekcie cel targetSdkVersion musi być mniejszy niż 23.

dzięki.


Twoje rozwiązanie działa, ale może to być poważny problem, ponieważ Play Store jest obowiązkowe, aby ustawić targetSdkversion na> = 26 sierpnia 1 roku.
Shishir Shetty

2

W moim przypadku (używam formularzy Xamarin) ten błąd został zgłoszony z powodu błędu wiązania - np .:

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

Zasadniczo przez pomyłkę usunąłem właściwość modelu widoku. W przypadku programistów Xamarin, jeśli masz ten sam problem, sprawdź swoje powiązania ...


2

Jeśli dodałeś do swojego projektu natywny kod C. Ta odpowiedź może być pomocna.

Dodałem trochę natywnego kodu C w projekcie Android.

Teraz próbowałem uzyskać dostęp do kodu, który zwracał mi ciąg natywny, zanim przetworzyłem ciąg, który ustawiłem jego wartość domyślną na nullptr. Teraz po odzyskaniu jego wartości w kodzie java napotkałem ten problem.

Ponieważ nasz natywny kod C znajduje się poza katalogiem java, więc nie mamy pojęcia o dokładnej linii kodu, która jest przyczyną problemu. Proponuję więc sprawdzić plik .cpp i znaleźć tam jakąkolwiek wskazówkę.

Mam nadzieję, że wkrótce pozbędziesz się problemu. :)


1

W moim przypadku przyczyną problemu był Android Profiler. W Android Studio kliknij „Android Profiler” i „end session”.

Jak na ironię, powodowało to również ekstremalne problemy z wydajnością w aplikacji.


1

Dodaj te dwie linie do swojego build.gradle w sekcji Androida:

android{
    compileOptions {
            sourceCompatibility 1.8
            targetCompatibility 1.8
        }
}

5
Chociaż ten kod może dostarczyć rozwiązania pytania, lepiej jest dodać kontekst wyjaśniający, dlaczego / jak to działa. Może to pomóc przyszłym użytkownikom w nauce i zastosowaniu tej wiedzy do własnego kodu. Prawdopodobnie będziesz mieć pozytywne opinie od użytkowników w postaci pozytywnych opinii, gdy kod zostanie wyjaśniony.
borchvm

0

Sprawdź swój JNI / kod macierzysty. Jedno z moich odniesień było zerowe, ale było przerywane, więc nie było to zbyt oczywiste.


0

sprawdź swoje rodzime funkcje, czy zwraca poprawnie, czy nie. Jeśli nie zostanie zwrócone, dodaj instrukcje return.


0

Dla mnie ten problem był spowodowany złą obsadą dwóch czynności. Niedawno przeniosłem tę metodę z Ćwiczenia 1 na inną 2. W ten sposób refaktor pozostawił tę jawną obsadę taką, jaka była wcześniej. Więc zamiast robić

((Activity1) mainActivity).hideDialog();

Miałem to zrobić

((Activity2) mainActivity).hideDialog();

Uwaga: Ale ten błąd nie wystąpił na Androidzie 8.0 Nie jestem jeszcze pewien, dlaczego.

*** Mam nadzieję, że to pomoże.


0

Miałem błąd błędu segmentacji z powodu problemów z pamięcią . Moja struktura z wieloma zmiennymi i tablicami miała tablicę o rozmiarze 1024.

Po zmniejszeniu rozmiaru do 512 błąd zniknął.

PS: To jest obejście, a nie rozwiązanie. Konieczne jest znalezienie rozmiaru struktury, a lepszym rozwiązaniem jest dynamiczny przydział pamięci .


Mam ten sam problem, ale działa odwrotnie. Przechowuję do 492 danych w mojej tablicy. Jeśli ustawię rozmiar na 512, pojawia się błąd segfault i zamyka moją aplikację, gdy zwiększę rozmiar do 1024, nie pojawia się. Mam problem ze zrozumieniem, jak to działa.
wight

0

Wystąpił ten błąd, gdy użyłem onDraw()funkcji wewnętrznej 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        
        }
    });
 }

Rozwiązałem go, usuwając ViewTreeObserver z onDraw
muzamil

0

Miałem ten problem z pakietem, który został dodany do mojej aplikacji (FancyShowCaseView) i spowodowałem ten problem na pre-Lolipop. ten pakiet został napisany w Kotlin, a moje główne kody zostały napisane w Javie. więc teraz sprawdzam wersję w pre-Lolipopie i nie pozwalam na wykonanie jej klasy. tymczasowo rozwiązał problem. sprawdź to, jeśli masz podobny problem jak ja


0

Zbuduj odcisk palca: „motorola / harpia / harpia: 6.0.1 / MPIS24.241-2.50-16 / 16: użytkownik / klucze-wydania” Wersja: „p1b0” ABI: „ramię” pid: 18139, tid: 25935, nazwa: GLThread 2137 >>> com.portable3d.okt.a3dmap1 <<< sygnał 11 (SIGSEGV), kod 2 (SEGV_ACCERR), adres błędu 0x7452f000

2 z 12 telefonów zwróciło błąd, znaleziono problem w onDrawFrame (), niektóre obiekty były zerowe, nie wiem dlaczego, właśnie ustawiłem

if(gears==null) return;.


0

Wystąpił problem podczas tworzenia pliku PDF za pomocą interfejsów API PDF systemu Android i przypadkowo użyłem canvas.save () i canvas.restore () po zamknięciu strony pdf.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.