올만에 다시 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 |
---|