android-ndk unity - Android 0x636f7d89(코드=1)에서 치명적 신호 11(SIGSEGV).어떻게 추적 할 수 있습니까?




segv_maperr signal (13)

만약 당신이 vitamio 라이브러리를 사용하고 있으며 치명적인 오류가 발생합니다.

그런 다음 프로젝트의 gradle targetSdkVersion이 23 미만이어야합니다.

감사.

나는 Android 앱에서 SIGSEGV 를 얻는 이유를 추적하는 다른 게시물을 읽었습니다. Canvas 사용과 관련된 가능한 NullPointer에 대해 앱을 조사 할 계획이지만 SIGSEGV 는 매번 다른 메모리 주소를 barfs합니다. 게다가 code=1code=2 보았습니다. 메모리 주소가 0x00000000 이라면 NullPointer라는 단서가 있습니다.

내가 가진 마지막 code=2 :

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

이것을 추적하는 방법에 대한 제안 사항이 있습니까?

용의자가 있는데, 아직 실험하고 싶지 않아. 내 앱은 오프라인 매핑을 위해 OSMDroid API를 사용합니다. OverlayItem 클래스는지도의 마커 / 노드를 나타냅니다. 네트워크를 통해 데이터를 수집하여 OverlayItem을 채우는 서비스를지도에 표시합니다. 내 디자인을 단순화하려는 노력의 일환으로, UI Activity와 Service에서 사용하는 몇 가지 추가 특성을 포함하는 자체 NodeOverlayItem 클래스로 OverlayItem을 확장했습니다. 이것은 나에게 UI와 서비스를위한 아이템 정보의 단일 포인트를 주었다. 인 텐트를 사용하여 뭔가 바뀌었을 때 UI 맵을 새로 고치기 위해 Activity로 브로드 캐스팅했습니다. 활동은 서비스에 바인딩되고 NodeOverlayItem의 목록을 가져 오는 Service 메소드가 있습니다. OSMDroid API의 OverlayItem 사용과 동시에 노드 정보를 업데이트하는 내 서비스라고 생각합니다. (동시성 문제)

이 글을 쓰면서 나는 이것이 정말로 문제라고 생각한다. 두통은 NodeOverlayItem에서 Node와 OverlayItem을 분리하지 않습니다. 즉, Activity가 Node에서 노드가 가지고있는 데이터가 필요합니다. 또한 활동이 생성되면 (onResume, etc ...) Activity가 떨어져있는 동안 서비스가 유지 보수 한 Node 데이터에서 OverlayItem 객체를 다시 작성해야합니다. 예를 들어 응용 프로그램을 시작하고 서비스가 데이터를 수집하며 UI가이를 표시하고 집으로 이동 한 다음 응용 프로그램으로 돌아 가면 활동은 최신 서비스 노드 데이터에서 OverlayItem을 가져 와서 다시 만들어야합니다.

나는 이것이 위대하거나 분명한 질문이 아니라는 것을 알고있다. 그것은 나의 모든 질문이 틈새이거나 모호하다는 것과 같습니다. SIGSEGV 오류를 해석하는 방법에 대한 제안이있는 사람은 대단히 감사하겠습니다!

업데이트 디버그 세션 중에 캡처 된 최신 크래시가 있습니다. 나는이 장치 중 3 개를 테스트에 사용하고 있고, 개발하고 테스트 할 때 모든 장치가 안정적으로 중단되지는 않습니다. GC 로깅이 기록 될 수 있도록 약간의 추가가 포함되었습니다. 문제가 메모리 고갈과 관련이 없다는 것을 알 수 있습니다.

03-03 02:02:38.328: I/CommService(7477): Received packet from: 192.168.1.102
03-03 02:02:38.328: I/CommService(7477): Already processed this packet. It's a re-broadcast from another node, or from myself. It's not a repeat broadcast though.
03-03 02:02:38.406: D/CommService(7477): Checking OLSRd info...
03-03 02:02:38.460: D/CommService(7477): Monitoring nodes...
03-03 02:02:38.515: D/dalvikvm(7477): GC_CONCURRENT freed 2050K, 16% free 17151K/20359K, paused 3ms+6ms
03-03 02:02:38.515: I/CommService(7477): Received packet from: 192.168.1.102
03-03 02:02:38.515: D/CommService(7477): Forwarding packet (4f68802cf10684a83ac4936ebb3c934d) along to other nodes.
03-03 02:02:38.609: I/CommService(7477): Received packet from: 192.168.1.100
03-03 02:02:38.609: D/CommService(7477): Forwarding packet (e4bc81e91ec92d06f83e03068f52ab4) along to other nodes.
03-03 02:02:38.609: D/CommService(7477): Already processed this packet: 4204a5b27745ffe5e4f8458e227044bf
03-03 02:02:38.609: A/libc(7477): Fatal signal 11 (SIGSEGV) at 0x68f52abc (code=1)
03-03 02:02:38.914: I/DEBUG(4008): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
03-03 02:02:38.914: I/DEBUG(4008): Build fingerprint: 'Lenovo/IdeaTab_A1107/A1107:4.0.4/MR1/eng.user.20120719.150703:user/release-keys'
03-03 02:02:38.914: I/DEBUG(4008): pid: 7477, tid: 7712  >>> com.test.testm <<<
03-03 02:02:38.914: I/DEBUG(4008): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 68f52abc
03-03 02:02:38.914: I/DEBUG(4008):  r0 68f52ab4  r1 412ef268  r2 4d9c3bf4  r3 412ef268
03-03 02:02:38.914: I/DEBUG(4008):  r4 001ad8f8  r5 4d9c3bf4  r6 412ef268  r7 4c479df8
03-03 02:02:38.914: I/DEBUG(4008):  r8 4d9c3c0c  r9 4c479dec  10 46cf260a  fp 4d9c3c24
03-03 02:02:38.914: I/DEBUG(4008):  ip 40262a04  sp 4d9c3bc8  lr 402d01dd  pc 402d0182  cpsr 00000030
03-03 02:02:38.914: I/DEBUG(4008):  d0  00000001000c0102  d1  3a22364574614c7d
03-03 02:02:38.914: I/DEBUG(4008):  d2  403fc0000000007d  d3  363737343433350a
03-03 02:02:38.914: I/DEBUG(4008):  d4  49544341223a2273  d5  6f6567222c224556
03-03 02:02:38.914: I/DEBUG(4008):  d6  3a223645676e6f4c  d7  000000013835372d
03-03 02:02:38.914: I/DEBUG(4008):  d8  0000000000000000  d9  4040000000000000
03-03 02:02:38.914: I/DEBUG(4008):  d10 0000000000000000  d11 4040000000000000
03-03 02:02:38.914: I/DEBUG(4008):  d12 4040000000000000  d13 0000000000000021
03-03 02:02:38.914: I/DEBUG(4008):  d14 0000000000000000  d15 0000000000000000
03-03 02:02:38.914: I/DEBUG(4008):  d16 3fe62e42fefa39ef  d17 3ff0000000000000
03-03 02:02:38.914: I/DEBUG(4008):  d18 3fe62e42fee00000  d19 0000000000000000
03-03 02:02:38.914: I/DEBUG(4008):  d20 0000000000000000  d21 3ff0000000000000
03-03 02:02:38.914: I/DEBUG(4008):  d22 4028000000000000  d23 3ff0000000000000
03-03 02:02:38.914: I/DEBUG(4008):  d24 0000000000000000  d25 3ff0000000000000
03-03 02:02:38.914: I/DEBUG(4008):  d26 0000000000000000  d27 c028000000000000
03-03 02:02:38.914: I/DEBUG(4008):  d28 0000000000000000  d29 3ff0000000000000
03-03 02:02:38.914: I/DEBUG(4008):  d30 3ff0000000000000  d31 3fecccccb5c28f6e
03-03 02:02:38.914: I/DEBUG(4008):  scr 60000013
03-03 02:02:39.046: I/DEBUG(4008):          #00  pc 0006b182  /system/lib/libcrypto.so (EVP_DigestFinal_ex)
03-03 02:02:39.046: I/DEBUG(4008):          #01  pc 0006b1d8  /system/lib/libcrypto.so (EVP_DigestFinal)
03-03 02:02:39.054: I/DEBUG(4008):          #02  pc 0001f814  /system/lib/libnativehelper.so
03-03 02:02:39.054: I/DEBUG(4008):          #03  pc 0001ec30  /system/lib/libdvm.so (dvmPlatformInvoke)
03-03 02:02:39.054: I/DEBUG(4008):          #04  pc 00058c70  /system/lib/libdvm.so (_Z16dvmCallJNIMethodPKjP6JValuePK6MethodP6Thread)
03-03 02:02:39.054: I/DEBUG(4008): code around pc:
03-03 02:02:39.054: I/DEBUG(4008): 402d0160 0003151e 4604b570 f7ff460d 4620ff81  ....p..F.F.... F
03-03 02:02:39.054: I/DEBUG(4008): 402d0170 f7ff4629 bd70ff93 4604b570 460e6800  )F....p.p..F.h.F
03-03 02:02:39.054: I/DEBUG(4008): 402d0180 68834615 dd062b40 21fa4810 44784a10  [email protected]+...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

승인! 실제로 댓글과 답변을 제출 한 사람들에게 유감이지만 문제를 발견했습니다. 나는 이것이 자신의 개인 SIGSEGV를 추적하려고하는 많은 사람들을 도울 것이라고 생각하지 않는다. 그러나 광산 (이것은 매우 어려웠다)은 전적으로 이것과 관련이있다.

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

내 덤프 종류의 libcrypto.so에서 나를 알았습니다. 이미 패킷을 보았는지 확인하려고 할 때 패킷 데이터의 MD5 해시를 수행하고, 내가 가지고 있으면이를 건너 뜁니다. 나는이 시점에서이 해시를 추적하는 것과 관련된 추악한 스레딩 문제라고 생각했지만 java.security.MessageDigest 클래스라는 것을 알게되었습니다. 스레드로부터 안전하지 않습니다!

나는 장치 UUID와 타임 스탬프를 기반으로하는 모든 패킷에 채워 넣은 UID로 바꿨다. 그 후로는 문제가 없습니다.

내 상황에 있었던 사람들에게 내가 배울 수있는 교훈은 100 % 자바 애플리케이션이라 할지라도 크래시 덤프에 실마리가있는 네이티브 라이브러리와 심볼에주의를 기울이는 것입니다. SIGSEGV + lib .so 이름에 대한 인터넷 검색은 쓸데없는 코드 = 1 등보다 훨씬 더 많이 진행될 것입니다. 다음으로 Java App이 네이티브 코드에 접근 할 수있는 위치에 대해 생각해보십시오. 나는 Service + UI 스레딩 문제로 Canvas가 무언가를 그렸던 곳에서 (내가 SIGSEGV에서 가장 많이 보았던 경우) 무언가를 그렸고 그것이 내가 작성한 코드와 완전히 관련되었을 가능성을 무시한 실수를했다. 크래시 덤프의 lib .so와 관련이 있습니다. 당연히 java.security는 libcrypto.so의 네이티브 구성 요소를 사용하여 속도를 높이기 때문에 안드로이드 + SIGSEGV + libcrypto.so를 검색하고 문서화 된 문제를 발견했습니다. 행운을 빕니다!


네이티브 함수가 제대로 반환되는지 여부를 확인하십시오. 반환되지 않으면 반환 문을 추가하십시오.


다음과 같이 비트 맵을 사용하면이 오류가 발생합니다.

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

문제점은 비트 맵의 ​​크기를 줄이는 것이 었습니다 (1000px 이상> 700px).


나는 안드로이드 4.4.4 (넥서스, 삼성)에서 SIGSEGV에 직면했습니다. 그리고 그것은 치명적인 오류가 DecimalFormat 사용하여 null String 을 파싱하는 것으로 나타났습니다.

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

Android> 21에서 try / catch를 사용하여 성공적으로 처리되었습니다.


제 경우에는 안드로이드 프로파일 러 때문에 문제가 발생했습니다. Android Studio에서 'Android Profiler'및 '세션 종료'를 클릭하십시오.

아이러니하게도 애플리케이션에서 극단적 인 성능 문제가 발생했습니다.


JNI / 네이티브 코드를 확인하십시오. 내 참조 중 하나는 null이지만 간헐적 이었으므로 그다지 명확하지 않았습니다.


오늘 나는 Fatal signal 11 (SIGSEGV), code 1, fault addr 0x8 in tid 18161 문제에 Fatal signal 11 (SIGSEGV), code 1, fault addr 0x8 in tid 18161 하고 나는 Fatal signal 11 (SIGSEGV), code 1, fault addr 0x8 in tid 18161 하루를 해결하기 위해 고투.

나는 캐시를 삭제하고 .gradle 파일과 모든 것을 삭제하는 많은 것들을 시도했다.

마지막으로 disable Instant Run 하고 이제이 문제가 다시 발생하지 않습니다. 이제는 인스턴트 실행을 활성화 한 후 내 응용 프로그램이 작동합니다. 즉시 실행 문제 일 수도 있습니다. 사용 중지 및 즉시 실행 사용 시도


gson으로 변환 된 문자열로 객체를 공유 환경 설정에 저장하여이 오류가 발생했습니다. gson String은 좋지 않았기 때문에 객체를 검색하고 deserialize하는 것은 실제로 올바르게 작동하지 않았습니다. 즉, 객체에 대한 모든 후속 액세스가이 오류를 발생 시켰습니다. 무서운 :)


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

매우 나쁜 습관 : /


먼저, 삭제 표시 스택 추적을 가져 오면 앱이 다운 될 때마다 인쇄됩니다. 이 같은:

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

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

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

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

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

그런 다음 addr2line 유틸리티 (NDK 도구 체인에서 찾으십시오)를 사용하여 충돌하는 기능을 찾으십시오. 이 샘플에서는

addr2line -e -f libc.so 0001173c

그러면 문제가 발생한 곳을 알 수 있습니다. 물론 이것은 libc에 있기 때문에 도움이되지 않습니다.

따라서 arm-eabi-objdump 의 유틸리티를 결합하여 최종 대상을 찾을 수 있습니다.

저를 믿으십시오, 그것은 어려운 작업입니다.

그냥 업데이 트를 위해. 나는 오랜 시간 동안 전체 소스 트리에서 안드로이드 네이티브 빌드를하고 있었다고 생각합니다. 오늘까지 NDK 문서를주의 깊게 읽었습니다. NDK-r6가 출시 된 이래로 ndk-stack 이라는 유틸리티가 제공되었습니다.

다음은 NDK-r9 타르 공 공식 NDK 문서의 내용입니다.

개요 :

ndk-stack 은 'adb logcat'의 출력에 나타나는 스택 추적을 필터링하고 공유 라이브러리 내의 모든 주소를 해당 값으로 바꿀 수있는 간단한 도구입니다.

요약하면 다음과 같이 번역됩니다.

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

더 읽기 쉬운 출력으로 :

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

용법:

이렇게하려면 먼저 응용 프로그램의 공유 라이브러리의 기호 버전을 포함하는 디렉토리가 필요합니다. NDK 빌드 시스템 (예 : ndk-build )을 사용하는 경우, 이들은 항상 $ PROJECT_PATH / obj / local / 아래에 위치하며, 여기서는 장치의 ABI를 나타냅니다 (즉, 기본적으로 armeabi ).

프로그램에 대한 직접 입력으로 logcat 텍스트를 입력 할 수 있습니다 (예 :

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

또는 -dump 옵션을 사용하여 logcat을 입력 파일로 지정할 수 있습니다. 예 :

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

중요 :

이 도구는 logcat 출력에서 시작을 포함하는 초기 행을 찾습니다 (예 :

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

트레이스를 복사 / 붙여 넣을 때 트레이스에서이 라인을 잊지 마십시오. 그렇지 않으면 ndk-stack 이 올바르게 작동하지 않습니다.

할 것:

ndk-stack 의 차후 버전은 adb logcat 을 시작하고 라이브러리 경로를 자동으로 선택하려고합니다. 지금은 이러한 단계를 수동으로 수행해야합니다.

현재, ndk-stack 은 디버그 정보가없는 라이브러리를 처리하지 않습니다. 주어진 PC 주소 (예 : 위의 libc.so 예제에서와 같이)에 가장 가까운 기능 진입 점을 감지하는 것이 유용 할 수 있습니다.


나는 또한이 오류가 여러 번있어 그것을 해결했습니다. 이 오류는 원시 측의 메모리 관리의 경우에 직면하게됩니다.

응용 프로그램이 주소 공간 외부의 메모리에 액세스하고 있습니다. 이것은 잘못된 포인터 액세스 일 가능성이 큽니다. SIGSEGV = 원시 코드의 세그먼트 화 오류. Java 코드에서 발생하지 않으므로 세부 사항이있는 스택 추적을 볼 수 없습니다. 그러나 응용 프로그램 프로세스가 충돌 한 후에도 약간 둘러 보면 logcat에 스택 추적 정보가 표시 될 수 있습니다. 파일 내에서 줄 번호를 알려주지는 않지만 호출 체인에서 사용중인 개체 파일과 주소를 알려줍니다. 거기에서 문제의 코드 영역을 파악할 수 있습니다. 또한 대상 프로세스에 대한 gdb 네이티브 연결을 설정하고 디버거에서 잡을 수 있습니다.


0:40:20부터 Google I / O 2011 : Android Development Tools 대화에서 에뮬레이터 문제를 검토 할 수 있습니다.

에뮬레이트 된 하드웨어에서 완전한 Android 환경이 실행되고 지침이 에뮬레이트 된 ARM 프로세서에서도 실행되므로 에뮬레이터가 느리게 실행됩니다.

주요 쵸킹 포인트는 렌더링입니다. 전용 하드웨어에서는 실행되지 않지만 소프트웨어 렌더링을 통해 실제로 수행됩니다. 화면 크기를 줄이면 에뮬레이터 성능이 크게 향상됩니다. 더 / 더 빠른 메모리를 얻는 것은 도움이되지 않습니다.

그들은 당시에 에뮬레이터가 호스트 하드웨어를 통해 특정 명령어를 파이프 할 수 있도록 인터페이스를 개발 중이라고 언급 했으므로 궁극적으로 데스크탑 하드웨어의 원시 성능으로 에뮬레이터 성능을 활용할 수있게되었습니다.





android android-ndk android-service sigsegv