brunch

You can make anything
by writing

C.S.Lewis

by 서오석 Jun 30. 2015

iOS Symbolication

Ubuntu에서 처리하기

전에 Tistory에 iOS Symbolication에 대해서 글을 썼는데 그 내용을 바탕으로 좀 더 추가한 내용이다.

원본 글은 "symbolication을 ubuntu에서 하기" 이다. 


iOS Symbolication을 우분투에서 처리하려는 이유는 symbolicatecrash의 atos 와 facebook에서 만든 atosl간에 성능차가 없고(atosl이 더 빠르다.) 대량의 crash report를 처리하기 위해선 처리하는 서버를  scale out을 해야 하기 때문이다. 

(물론 OSX 장비도 scale out 할 수 있지만.. 인프라적인 요소나 비용상의 이유가 더 크다.) 


우분투에서 symbolication을 하기 위해서는 몇가지 제약이 있다.

1. 우분투에서 lipo를 대신할 명령어가 따로 존재하지 않아 app이나 system의 symbol에서 지원하는 cpu architecture를 알기가 쉽지 않다.

2. atos의 경우 app symbol만 지정하면 ios 사용자 라이브러리까지 쉽게 symbolication이 되지만 여기서 사용 할 facebook의 atosl의 경우 몇가지 추가작업이 필요하다.

3. 새로운 cpu architecture가 나오는 경우 이를 대응하는 것이 느리다. 


위의 제약이 있긴 하지만 osx에서 symbolication을 하지 않고 ubuntu를 이용하는 건 대량 crash를 처리할 때는 메리트가 있다.


이제 ubuntu에서 iOS Symbolication을 해보자


첫번째로 필요한건 atosl을 구동하는데 필요한 dwarf lib다. ubuntu는 apt-get으로 간단하게 install 된다.

apt-get install libdwarf-dev binutils-dev

install이 완료되었으면 atosl을 다운받자.

압축을 풀고 atosl 디렉토리로 이동 후 config.mk.local 파일을 만들어야 한다.

cat > config.mk.local
LDFLAGS += -L/usr/lib/
LDFLAGS += -L/usr/share/lintian/overrides
LDFLAGS += -L/usr/share/lintian/overrides/binutils

ctrl-z

이제 설치를 하자. root 권한으로 설치를 해야 한다.

make 
make install

atosl --help를 쳤을 때 다음과 같이 동작하면 정상적으로 인스톨 된 것이다.

/atosl --help
atosl 1.1
Usage: atosl -o|--dsym <FILENAME> [OPTIONS]... <ADDRESS>...
  -o,> file to find symbols in
 -v, --verbose enable verbose (debug) messages
....

atosl은 atos와 사용법이 거의 비슷하며 차이가 있다면 굳이 app 파일이 필요가 없다는 것이다.

따라서 ubuntu에서 symbolication을 할 때는 오로지 app의 dSYM 파일만 필요하다.


이제 테스트로 심볼리케이션을 해보자

atosl --arch armv7 -o SampleApp.app.dSYM/Contents/Resources/DWARF/SampleApp --load-address 0x6a000 0x0037096a 0x00370a16 0x0036b6b6 0x0036b4d2 0x00369f3c 0x00366bc4 0x0035036c 0x00070bb8

위 명령어의 옵션을 살펴보면 다음과 같다.

--arch : symbolication을 할 cpu architecture다. 

-o : symbolication을 할 app의 dSYM 이나 system libery symbol의 path이다.

--load-address $1: backtrace의 load address를 의미한다.

--load-address $2 $3 $4.... : backtrace의 runtime address이다.


symbolication이 완료되면 runtime address 순서대로 symbolication된 결과가 나온다.

-[MSLCoreDataManager createTable:datastore:] (in SampleApp) (MSLCoreDataManager.m:531)
-[MSLCoreDataManager getTable:datastore:] (in SampleApp) (MSLCoreDataManager.m:545)
__37-[MSLSyncManager datastore:snapshot:]_block_invoke (in SampleApp) (MSLSyncManager.m:928)
-[MSLSyncManager datastore:snapshot:] (in SampleApp) (MSLSyncManager.m:922)
__56-[MSLSyncManager snapshotWithDatastore:success:failure:]_block_invoke (in SampleApp) (MSLSyncManager.m:764)
__85-[MSLSyncManager processHTTPRequestWithPath:method:header:parameter:success:failure:]_block_invoke239 (in SampleApp) (MSLSyncManager.m:402)
__73-[MSLURLSessionManagerTaskDelegate URLSession:task:didCompleteWithError:]_block_invoke_276 (in SampleApp) (MSLURLSessionManager.m:184)
0x00070bb8

대부분 잘 된듯 하다. 맨 마지막라인은 0x00070bb8로 제대로 Symbolication이 안된 것인데 atosl의 경우 종종 이렇게 제대로 symbolication이 안된다. 마지막 라인의 경우 거의 대부분 ios app의 시작지점인 main을 의미하기 때문에 크게 문제가 될 여지는 없다.


iOS Symbolication을 가지고 crash report를 만들어주는 서비스를 개발하는 개발자라면 크게 어려운 내용은 아니라서 여기까지 쓴다.

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari