본문 바로가기
Android/Debug

[안드로이드] tombstone 디버깅 1

by Jay Son 아기 냥이 해린 짱💖 2020. 5. 29.

https://source.android.google.cn/devices/tech/debug?hl=ko

동적으로 연결된 실행 파일이 시작되면 여러 신호 핸들러가 등록되는데, 충돌 시 logcat에 기본 충돌 덤프가 기록되고 보다 자세한 tombstone 파일은 /data/tombstones/에 기록됩니다. tombstone은 충돌 프로세스에 대한 추가 데이터가 포함된 파일입니다. 특히, 여기에는 (신호를 포착한 스레드뿐만이 아니라) 충돌 프로세스 내 모든 스레드, 전체 메모리 맵 및 열려 있는 모든 파일 설명어에 대한 스택 트레이스가 포함되어 있습니다.

Android 8.0 이전에는 debuggerd  debuggerd64 데몬이 충돌을 처리했습니다. Android 8.0 이상에서는 필요에 따라 crash_dump32  crash_dump64가 생성됩니다.

충돌 덤퍼는 이미 연결된 항목이 없는 경우에만 연결할 수 있습니다. 즉, strace 또는 gdb 등과 같은 도구가 충돌 덤프가 발생하지 않도록 합니다.

출력 예(타임스탬프 및 관련 없는 정보는 삭제됨):

 

네이티브 Android 플랫폼 코드 디버깅  |  Android 오픈소스 프로젝트

1.  메모리 참조 오류

 pid: 27726, tid: 30206, name: Thread-261  >>> com.json.example <<<
    signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xee2c0
    r0  cbf6faa8  r1  000ee2c0  r2  00000000  r3  000ee2c0
    r4  00000000  r5  00000000  r6  cbf6fa20  r7  cbb88c04
    r8  cbf6fa64  r9  cbb83880  r10 cbf764f4  r11 cbf6fb18
    ip  00000033  sp  cbf6f9c0  lr  cbb84ca8  pc  cd40107c

    backtrace:
    #00 pc 0006207c  /data/app/com.json.example-FAphohEqxrDy-lqfD7DjWQ==/lib/arm/libcc.so (lsf_dec+1996)
    #01 pc 0001b5d8  /data/app/com.json.example-FAphohEqxrDy-lqfD7DjWQ==/lib/arm/libcc.so (acelp_core_dec+4188)
    #02 pc 0003eb00  /data/app/com.json.example-FAphohEqxrDy-lqfD7DjWQ==/lib/arm/libcc.so (cc_dec+1140)
    #03 pc 00019a50  /data/app/com.json.example-FAphohEqxrDy-lqfD7DjWQ==/lib/arm/libcc.so (Java_com_jsonmedia_jniApi_cc_decode+276)
    #04 pc 0000078b  /data/data/com.json.example/files/oat/arm/test.odex (offset 0x1f000)

    stack:
    cbf6f980  45ac21a0
    cbf6f984  deafc563  <anonymous:d6b7d000>
    cbf6f988  cbf76530  <anonymous:cbe7c000>
    cbf6f98c  cbf76570  <anonymous:cbe7c000>
    cbf6f990  00000003
    cbf6f994  cd44a06c  /data/app/com.json.example-FAphohEqxrDy-lqfD7DjWQ==/lib/arm/libcc.so (lsf2lsp+72)
    cbf6f998  46480000
    cbf6f99c  00000000

    - PID 27726으로 생성된 com.json.example 앱 Thread 261 에서 사용하는 so에서 에러 발생

    - 로그가 존재 한다면 tid 30206을 검색해 해당 로그 확인

    - backtrace 확인

       > libcc.so cc_decode API에서 시작 -> lsf_dec API에서 tombstone 에러 발생

       > 호출 순서 아래에서 위 #04 -> #03 -> #02 -> #01 -> #00 이슈 발생한 목적지

 

2. NullPoint 오류

pid: 5974, tid: 14230, name: Thread-943  >>> com.json.example <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xf
Cause: null pointer dereference
    r0  0000003b  r1  00000000  r2  a4863474  r3  00000003
    r4  ffffffff  r5  00000001  r6  ffffffff  r7  c9225008
    r8  ed251d8c  r9  e28dd600  r10 5f68721c  r11 c5dd0bf8
    ip  c5dd06f8  sp  c5dd0bd8  lr  c9221488  pc  c9221488

backtrace:
    #00 pc 00002488  /data/app/com.json.exampe-iUKPX7Xzx0O-tf5k_EMHjA==/lib/arm/libopencc.so (android_setPlayMode+276)
    #01 pc 00000477  /data/data/com.json.example/files/oat/arm/test.odex (offset 0x1f000)

stack:
         c5dd0b98  6f87ead0  /data/dalvik-cache/arm/system@framework@boot-core-oj.art
         c5dd0b9c  ea1dc451  /system/lib/libart.so (_ZN3art12JniMethodEndEjPNS_6ThreadE+12)
         c5dd0ba0  6f7e6940  /data/dalvik-cache/arm/system@framework@boot-com.cybertel.service.art
         c5dd0ba4  1338b3a8  <anonymous:12c00000>
         c5dd0ba8  1324e1e0  <anonymous:12c00000>
         c5dd0bac  71c715f5  /system/framework/arm/boot-framework.oat (android.media.AudioSystem.setDeviceConnectionState [DEDUPED]+172)
         c5dd0bb0  00430000
         c5dd0bb4  005b0000
         c5dd0bb8  a4863474
         c5dd0bbc  a4863474
         c5dd0bc0  ffffffff
         c5dd0bc4  00000001
         c5dd0bc8  ffffffff
         c5dd0bcc  c9225008  /data/app/com.json.example-iUKPX7Xzx0O-tf5k_EMHjA==/lib/arm/libopensl.so
         c5dd0bd0  c9221488  /data/app/com.json.example-iUKPX7Xzx0O-tf5k_EMHjA==/lib/arm/libopensl.so (android_setPlayMode+276)
         c5dd0bd4  00000003
    #00  c5dd0bd8  00000001
         ........  ........
    #01  c5dd0c00  e644a02c  <anonymous:e6434000>
         c5dd0c04  00000000
         c5dd0c08  00000001
         c5dd0c0c  131d5d18  <anonymous:12c00000>
         c5dd0c10  00000000
         c5dd0c14  00000000
         c5dd0c18  00000000
         c5dd0c1c  00000000
         c5dd0c20  00000000
         c5dd0c24  00000000
         c5dd0c28  00000000
         c5dd0c2c  00000000
         c5dd0c30  00000000
         c5dd0c34  00000000
         c5dd0c38  00000000
         c5dd0c3c  00000000

   - PID 및 Error 발생한 패키지명 찾기 동일

   - backtrace 확인 시 libopencc.so의 setPlayMode API에서 null 로 초기화된 변수를 참조함.

 

so 라이브러리 문제가 발생하여 tombstone 에러 발생 할 경우 문제가 되는 API는 쉽게 확인이 가능하지만 해당 원인이 발생하는 원인은 프로그램 구현 방식에 따라 다름.

 

case 1 : JAVA 코드에서 라이브러리 변수를 생성/종료 API를 호출 과정에서 종료된 메모리를 참조

case 2 : JAVA에세 멀티 쓰레드 생성하여 라이브러리스 특정 API 중복 호출중 메모리 참조 오류

 

 

tombstone 디버깅 2 보기 : https://json8.tistory.com/66

 

[안드로이드] tombstone 디버깅 2

참고용으로 안드로이드 공식 사이트 Diagnosing Native Crashes 내용 정리함. 1. Abort SIGABRT Abort message 메시지 crash 원인은 #00 pc 0001cb16 /system/lib/libc.so (abort+57) 로그캣 로그에  "abort mess..

json8.tistory.com

 

반응형

'Android > Debug' 카테고리의 다른 글

[안드로이드] tombstone 디버깅 2  (0) 2020.07.05