올만에 다시 iOS 심볼리케이션 이야기..


티스토리로 글쓰면 별로 안이뻐서 대충 써도 이뻐지는 블로그를 찾다가 실패..


직접 올리기도 귀찮고..-0-;;


일단 우분투에서 ios symbolication을 하는 건 osx처럼 간단하지는 않다. 


냐하면 심볼리케이션을 할 때 cpu의 archi type을 확인하는데 이게 osx에서는 lipo라는 명령어로 확인하고 거기에 맞는 arch type으로 심볼리케이션을 한다.


근데 lipo는 linux용이 없기 때문에 다른 걸로 archi type을 찾아야 한다.. (일단 이 부분은 현재 나도 못찾았다.. 전공이 C 디버그가 아니라서..;;)


그래서 app crash 정보 중 cpu architecture가 정확하다고 판단(실제 완전 정확하진 않음..)하고 적용해야 한다.


우분투에서 심볼리케이션을 할라면 atos를 대체 할 atosl이 필요하다.


atosl : https://github.com/facebook/atosl 


페북에서 만든 것이고 내부적으로 dwarf를 이용해서 심볼리케이션을 해준다. 


atosl 설치는 우분투에서 하면 쉽다.


일단 우분투에 dwarf 라이브러리를 깔자.


apt-get install libdwarf-dev binutils-dev



그리고 atols을 다운받자


압축을 풀고 atols 폴더로 간 다음 


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


이걸 만들어주고 이제 설치를 하자


make  
make install



root에서 install해줘야 한다.


인스톨이 완료되었다면 


atols --help 이렇게 쳐보자.


/atosl --help

atosl 1.1

Usage: atosl -o|--dsym <FILENAME> [OPTIONS]... <ADDRESS>...


  -o, --dsym=FILE file to find symbols in

  -v, --verbose enable verbose (debug) messages

  -l, --load_address=ADDRESS specify application load address

  -A, --arch=ARCH specify architecture

  -g, --globals lookup symbols using global section

  -c, --no-cache don't cache debugging information

  -V, --version get current version

  -h, --help this help


위처럼 나오면 잘 설치된거다.


이제 심볼리케이션을 한번 해보자

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


-[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


잘된다.


파라미터를 설명하면..


--arch : 심볼리케이션 할 아키텍쳐

-o : 심볼리케이션 할 앱의 dSYM파일

--load-address $1 : load address , $2.... : runtime address 


이다 


runtime address를 등록한 순서대로 아래 심볼리케이션 된 라인들이 나온다. 파싱해서 사용하면된다.


여기까진 앱 심볼리케이션이고..


시스템 심볼리케이션도 저거로 된다. 


똑같이 sdk 심볼을 -o에 넣고 --load-address 설정하면 된다.



알고보면 별로 안어려운데.. 개삽질 끝에 알아낸 것들이다..ㅋㅋㅋ


페북 아저씨들은 참 똑똑한 것 같다.ㅎ

'개발 이야기' 카테고리의 다른 글

iOS symbolication dwarfdump로 하기  (0) 2015.01.30
Posted by 서오석
,