Tombstone 무덤: 나 죽어 여기 기록 되다..
앱 비정상 종료 시 logcat에 기본 크래시가 기록되고, 더 자세한 내용은 Tombstone 파일은 /data/tombstones/에 기록된다.
native crash가 발생한 경우 더 상세한 내용을 보고자 tombstone 을 찾게 되었다.
Tombstone은 비 정상 종료 프로세스에 대한 추가 데이터가 포함된 파일입니다. 여기에는 신호를 포착한 스레드가 아니라 정상 종료 프로세스 내 모든 스레드, 전체 메모리 및 특별히 있는 모든 파일 설명자의 그리드 트레이스가 포함되어 있습니다.
루팅 단말인 경우는 Android studio - Device explorer- /data/tombstones/ 경로로도 쉽게 접근이 가능하다.
일반적으로 /data/tombstones/ 경로는 루팅단말이 아닌 이상 아래와 같이 접근이 어렵다.
/system/bin/sh: cd: /data/tombstones: Permission denied
bugreport를 추출해서 tombstones 파일을 조회하는 방법을 택했다.
adb bugreport ./bugreport.zip
추출된 bugreport 압축을 해제하면 bugreport-FS-data-tombstones 에서
tombstone_00 과 같은 파일을 조회할 수 있다.

파일을 열어보면 logcat 보다 자세하게 에러로그가 기록되어 있다.
backtrace:
#00 pc 000000000005b730 /apex/com.android.runtime/lib64/bionic/libabc.so (abort+168) (BuildId: 37f537c2ba9dcbb262a0a68f41a21da4)
#01 pc 000000000076fde0 /apex/com.android.art/lib64/libart.so (art::Runtime::Abort(char const*)+904) (BuildId: 7ece79c15d80914c83e60c9e93ac1684)
???? 왜 물음표만 반환하나요 선생님 ???
libabc.so 에 디버그 심볼이 없어서 그럴 수 있다. (strip 처리됨)
libabc.so가 strip 되어 디버그 심볼이 제거된 경우, addr2line이 파일 내의 정확한 라인 정보를 찾지 못함.
디버그심볼 유무 조회 명령어
file libabc.so
1) 디버그 심볼이 있는 경우 결과
ELF 64-bit LSB shared object, ARM aarch64, not stripped
2) 디버그 심볼이 없는 경우 결과
ELF 64-bit LSB shared object, ARM aarch64, stripped
공유 라이브러리 빌드할 때, 디버그 심볼 포함해준다 (-g 옵션 활성화)
ndk-build NDK_DEBUG=1
참고
- 안드로이드 공식문서: 네이티브 Android 플랫폼 코드 디버깅
- 스택오버플로우 글: Default tombstones location in android