Crash Logger 기술 소개 ( SKP Bug Reporting Platform)

안녕하세요? SK planet의 서비스 품질관리용 버그 리포팅 시스템인 Crash Logger를 소개하겠습니다.

1.  Crash Logger란 ?

Crash Logger란 단말에서 애플리케이션이 비정상 종료할 때, 실시간으로 단말 오류로그를 수집한 후 서버로 보냄으로써, 개발자들이 서버에 접속해서 오류로그 및 각종 통계정보를 통해 애플리케이션을 디버깅할 수 있도록 지원해주는 서비스 품질관리 시스템입니다.

그림 1.  Crash Logger 컨셉 다이어그램

2. Crash Logger 구동 프로세스 및 특징

( 구동 프로세스는 안드로이드 플랫폼을 기준으로 설명합니다 ) Crash Logger는 애플리케이션의 자바 코드 영역에서 비 정상 종료를 유발한 exception 처리는 물론, 애플리케이션이 JNI 를 쓰는 경우 C Native 코드영역에서 비정상 종료를 유발한 signal까지도 처리할 수 있습니다.

Crash Logger의 설치/구동/확인 시나리오는 아래와 같이 3가지 단계로 구분할 수 있습니다.

첫째, 개발자가 Crash Logger 라이브러리를 애플리케이션에 내장하는 단계 (설치)

1) 개발자는 Crash Logger 라이브러리 (JAR, SO)를 앱에 내장합니다

 그림 2.  Crash Logger 라이브러리를 애플리케이션에 내장

2) 개발자는 애플리케이션 코드영역에 Crash Logger 기능을 초기화 합니다.

애플리케이션 실행 시 호출되는 첫 번째 클래스의 onCreate 메소드 내에 Crash Logger 라이브러리가 제공하는 crashlogger.init 메소드를 호출함으로써 Crash Logger 초기화 합니다.

 그림3.  Crash Logger 초기화

3) 개발자는 애플리케이션마다 할당되는 androidmanifest 파일에 인터넷 권한 설정, 애플리케이션 클래스 등록, 오류신고 팝업 액티비티를 선언합니다.

 그림4.  Androidmanifest에 Crash Logger 정보  등록

위에서 권한 설정은 애플리케이션에 탑재된 Crash Logger 라이브러리가 오류 로그를 보내려면 당연히 네트워크를 이용해야 하기 때문에 사전에 설정되어 있어야 하는 항목입니다. 그리고 애플리케이션 클래스 등록은 (Crash Logger 초기화를 수행하는) crashlogger.init 메소드를 호출한 첫 번째 클래스인 애플리케이션 클래스를 등록한다는 의미이며, 마지막으로 오류신고 팝업 액티비티 등록은 애플리케이션이 비 정상적으로 종료될 때 오류를 Crash Logger 서버로 신고할지 말지를 결정하게 하는 신고 팝업 창을 등록한다는 의미입니다.

둘째, 애플리케이션이 단말에서 구동될 때 Crash Logger가 동작하는 단계(구동)

그림5.  Crash Logger 구동 흐름도

구동 단계는 아래와 같이 4가지 소 단계로 나눌 수 있습니다. (오류등록 – 오류발생 – 오류수집 – 오류전송 )

1) 오류등록 : 애플리케이션이 실행되면서 구동되는 애플리케이션 클래스 內- onCreate 메소드 內 – crashlogger.init 메소드가 호출됨으로써 Crash Logger가 초기화됩니다. 여기서 초기화 명령인 crashlogger.init 메소드의 역할은 애플리케이션 비정상 종료 시 발생하는 자바 exception 및 Native signal을 Crash Logger 라이브러리가 수신할 수 있도록 하는 것입니다.

Signal 종류 설명
SIGILL malformed, unknown, or privileged 명령 수행 시 발생
SIGABRT Code 상 assert failure에 의한 abortlibc 함수 호출 시 발생
SIGBUS Invalid Address Alignment, 존재하지 않는 물리적 주소 참조 시 발생
SIGFPE 잘못된 Floating Point 연산 수행 시 발생
SIGSEGV 잘못된 메모리 참조나 Segmentation Fault 경험 시 발생
SIGSTKFLT Coprocessor가 stack fault 경험 시 발생
SIGPIPE 연결된 process가 없는 상태에서 pipe write 시 발생

표 1.  Crash Logger 라이브러리의 SO파일이 처리하는 오류 Native signal 목록

2) 오류발생 : 애플리케이션이 비정상 종료될 때, Crash Logger 라이브러리 (JAR) 는 애플리케이션의 자바 코드 단에서 일으킨 uncaught exception를 수신합니다. 애플리케이션의 JNI 단에서 비정상 종료를 일으키게 되면, Crash Logger 라이브러리(SO)는 비정상 종료 Native signal들을 수신합니다.

3) 오류수집 : Crash Logger 라이브러리 (JAR)는 exception 발생 시의 콜스택 정보 및 Logcat 로그, 단말 부가정보( OS버젼, 단말 모델명) , 애플리케이션 버전을 결합하여 오류정보를 만듭니다.

4) 오류전송 : Crash Logger 라이브러리(JAR)는 수집된 오류정보를 서버에 전송합니다.

셋째, 개발자가 Crash Logger 서버에 접속해서 로그를 확인하는 단계(확인)

개발자는 서버에 접속하여 실시간으로 올라온 오류로그를 확인할 수 있습니다. 이 때 개발자가 디버깅을 위해 참조하는 로그는 콜스택 정보와 Logcat 정보입니다


그림6.  콜스택 정보 예시


그림7.  Logcat 정보 예시

Crash Logger의 기술적인 특징을 종래 유사 글로벌 솔루션과 비교하여 정리하자면 아래 표 2.와 같습니다.

Crash Logger는 앞에서 말씀 드린 대로, JNI 코드에서의 비 정상 종료 signal을 지원하는 것이 가장 큰 기술적인 차별성이라고 할 수 있으며 대상 플랫폼으로 Android와 iOS를 지원하고 있습니다. 또한 개발자 편의 기능으로  개발자의 애플리케이션 디버깅이 용이하도록 개발자 주석기능 및 다양한 통계기능을 제공하고 있습니다.

구분

Crash Logger

ACRA

Google Play

BugSense

Platform

Android
iOS

Android

Android

Android
iOS,
BlackBerry,
W7

개발자 주석

O

O

X

X

스택 추적

O

O

O

O

JNI 지원

O

X

X

X

수정 통보

X

X

X

O (유료)

실시간 리포트

O

N/A

O

O

Alert / Push

O

N/A

X

O

표 2. Crash Logger와 유사 글로벌 경쟁 솔루션과의 기능 비교

3. 포스팅을 마치며

본 글에서는 SK planet의 서비스 품질관리 시스템인 Crash Logger의 주요 기능에 대해 살펴보았습니다.

Crash Logger는 애플리케이션 비 정상 종료 시 오류정보를 실시간으로 서버에 보내, 개발자가 빠른 디버깅을 할 수 있도록 지원해주는 SK planet 품질 관리용 버그 리포팅 시스템입니다.

여기서, Crash Logger와 같은 플랫폼을 구축하는데 관심이 있으신 서비스 관리자 혹은 개발자 분들께 몇 가지 tip을 드리자면 아래와 같습니다.

첫째,   Crash Logger와 같은 플랫폼 구축 시  참고하실 수 있는 오픈 소스 레퍼런스입니다.

Crash Logger는 안드로이드 버전에서 자바  exception을 처리하는 ACRA 를  활용하여 개발하였으며  (출처 : https://github.com/ACRA/acra/ ),   iOS  버젼은 plcrashreporter 를 활용하여 개발하였습니다.
( 출처 :  https://code.google.com/p/plcrashreporter/)

둘째,  Crash Logger는 정적 분석 (Static Analysis )과 병행 운영하면 품질관리에 더욱 효과적입니다.

Crash Logger 를 통해 리포트되는 주요 오류들을 보면  java.lang.NulllPointerException, java.lang.IllegalStateException 등 정적 분석( Static Analysis) 을 통해 검출 할 수 있는 오류들이 의외로 많은 부분을 차지합니다.  이러한 정적분석 오류들은 상용화 이전인 개발 검증 단계에서 정적 분석을 수행하면 대부분 디버깅이 가능한 오류유형들입니다.  만약, 서비스 출시가 급하다고 정적 분석 없이 상용화를 하면 이러한 잠재적 오류가 대거 포함된 위험요소를 안고 서비스를 운영하는 셈이 됩니다.

버그 없는 완벽한 소프트웨어를 만드는 것은 어려운 일입니다.  고로, 상용화 이전 정적 분석을 통해 애플리케이션 품질을 최대한 안정화하고 , Crash Logger와 같은 버그 리포팅 플랫폼을  활용하여 상용화 전/후 실시간으로  리포트 되는 오류에 대해 빠른 디버깅으로 서비스 품질을 강화하는 것이 시스템적으로 서비스  품질을 관리하기 위한 최선책이 아닐까 싶습니다.

실제로 SK planet에서는 애플리케이션 개발 단계에서 정적 분석을 필수항목으로 활용하고 있으며, 상용화 전/후 Crash Logger를 통해 실시간 리포트 되는 오류를 수시로 모니터링하고 있습니다.  개발자는 수시/주기적으로 Crash Logger 서버에 접속해서 오류를 디버깅하고  품질관리 담당자는 오류 개수를 서비스 안정화의 지표로 활용하고 있습니다.

SK planet은 앞으로도 Crash Logger를 자사 애플리케이션에 기본 탑재함으로써 잠재적 VoC를 최소화함은 물론  빠른 디버깅을 통해 서비스 품질 수준을 지속적으로 높여나갈 예정입니다.

최윤석 QA팀

QA팀에서 Crash Logger, 원격검증 플랫폼 및 OK캐쉬백 사업 QA 업무를 담당하고 있습니다.

Facebook 

공유하기