Table of Contents

Android 상의 크래시 분석

Android 네이티브 및 Unity(Android)에서 발생하는 크래시에 대한 내용은 다음과 같습니다.

개발 중 크래시 위치 파악

Android Studio에서 Android 네이티브 프로그램을 디버깅할 때는 Configuration 설정에서 Debugger - Debug type을 Dual (Java + Native)로 변경해야 합니다.

crash Android configuratio

Android Studio에서 디버깅 시 필요한 정보는 아래 그림과 같습니다.

crash Android stack

lldb에서 bt를 입력하면 크래시 원인과 코드 실행 스택을 얻을 수 있습니다. 예시는 다음과 같습니다.

(lldb) bt
* thread #16, name = 'samples.helloar', stop reason = signal SIGSEGV: invalid address (fault address: 0x9c40)
* frame #0: 0x0000004922f3a1d8 libEasyAR.so`___lldb_unnamed_symbol3056$$libEasyAR.so + 6088
    frame #1: 0x0000004922f38568 libEasyAR.so`___lldb_unnamed_symbol3054$$libEasyAR.so + 288
    frame #2: 0x0000004922f347f8 libEasyAR.so`___lldb_unnamed_symbol2876$$libEasyAR.so + 332
    frame #3: 0x00000049be2390c8 libc.so`__pthread_start(void*) + 40
    frame #4: 0x00000049be1f04f8 libc.so`__start_thread + 72

코드 실행 스택에 libEasyAR.so 관련 내용이 존재하면 크래시가 EasyAR와 관련될 수 있습니다. 존재하지 않으면 크래시가 EasyAR와 관련없을 가능성이 높습니다.

lldb에서 image dump sections libEasyAR.so를 입력하면 동적 라이브러리 .text 섹션의 로드 주소를 얻을 수 있습니다. 예시는 다음과 같습니다.

(lldb) image dump sections libEasyAR.so
...
  SectID     Type             Load Address                             Perm File Off.  File Size  Flags      Section Name
...
  0x00000010 code             [0x0000004922e30cfc-0x0000004923654558)  r-x  0x00256cfc 0x0082385c 0x00000006 libEasyAR.so..text
...

출시 후 크래시 위치 파악

출시 후에도 크래시가 발생할 수 있습니다.

재현 가능한 크래시가 발생하면 Android Studio의 Profile/Debug 도구를 사용해 볼 수 있습니다. 이후 개발 중과 동일한 방법으로 크래시 위치를 파악할 수 있습니다.

crash Android debug

재현이 어려운 크래시가 발생하면 crash 보고 라이브러리를 사용하여 애플리케이션 크래시 정보를 가로채 서버로 보고할 수 있습니다. 그러나 반드시 크래시 정보에 코드 실행 스택과 모듈 로드 주소가 모두 포함되어야 합니다. Android 4.0부터 도입된 ASLR(주소 공간 배치 무작위화)로 인해 동적 라이브러리 모듈의 로드 주소는 실행 시마다 달라질 수 있습니다. 이로 인해 코드 주소도 동적으로 변합니다. 코드 스택 내의 코드 주소와 동적 라이브러리 모듈 로드 주소 간의 상대값만 알면 프로그램이 어느 위치에서 크래시되었는지 파악할 수 있습니다.

코드 실행 스택에 libEasyAR.so 관련 내용이 존재하면 크래시가 EasyAR와 관련될 수 있습니다. 존재하지 않으면 크래시가 EasyAR와 관련없을 가능성이 높습니다.

기타 크래시 관련 정보

  • EasyAR Sense 및 EasyAR Sense Unity Plugin 버전 예: 4.7.0.11800-cf8e24e30
  • 커뮤니티 에디션/기업용 에디션
  • CPU 아키텍처 aarch64/armeabi-v7a