iOS 심볼리케이션을 하려면 기본적으로 mac에서 debug모드로 하면 자동으로 된다.
개인 개발자면 별 문제가 없지만 nhn이나 skp, daumkakao 같이 다수의 앱을 서비스하는 회사에서는 iOS 앱의 크래쉬 정보를 서비스화 해서 전사 앱 개발을 하는데 도움을 주려고 시스템을 별도 구축한다.
몇가지를 보면 nhn의 ncrazer가 있고 skp는 crash logger라는 애고 daumkakao에는 moca crash report라는 시스템이 있다.
nhn ncrazer
저건 모두 mac에서 돌려야 돌아간다.
symbolicatecrash를 이리저리 뜯어서 속도를 빠르게 할 수 있다.
근데 두번째은 다이렉트로 해보는 방법도 있어서 그 부분을 소개해보련다.
그냥 간단히 예제를 하나 보자
앱의 bundle name은 TestApps다.
ios backtrace가 다음과 같다고 했을 때
0 libsystem_kernel.dylib 0x34d721d4 0x34d5d000 + 86484
1 libsystem_c.dylib 0x34cdbcf8 0x34cc7000 + 85240
2 libsystem_c.dylib 0x34cf7798 0x34cc7000 + 198552
3 libsystem_c.dylib 0x34d1190c 0x34cc7000 + 305420
4 TestApps 0x0034665e 0x6a000 + 2999902
5 TestApps 0x0026d99c 0x6a000 + 2111900
dwarfdump로 심볼리케이션 한 주소를 알아내기 위해서는 symbol address를 알아내야 한다.
symbol address를 알려면 일단 otool을 가지고 vmaddr의 메모리 주소를 알아내야 한다.
방법은
otool -arch armv7 -l ../TestApps.xcahive/Products/Applications/DaumApps.app/DaumApps
이런식으로 arch 명령어 주고 앱파일의 위치를 걸면
oad command 0
cmd LC_SEGMENT
cmdsize 56
segname __PAGEZERO
vmaddr 0x00000000
vmsize 0x00004000
fileoff 0
filesize 0
maxprot 0x00000000
initprot 0x00000000
nsects 0
flags 0x0
Load command 1
cmd LC_SEGMENT
cmdsize 736
segname __TEXT
vmaddr 0x00004000
vmsize 0x004d4000
fileoff 0
filesize 5062656
maxprot 0x00000005
initprot 0x00000005
nsects 10
flags 0x0
이런형태로 줄줄 뭐가 나오는데 Load command 가 LC_SEGMENT이고 segname이 __TEXT인 vmaddr이 우리가 필요한 메모리 주소다.
otool이 없어도 된다. dwarfdump로도 구할 수 있다.
방법은 dwarfdump -R /TestApps/dSYM/ 을 하게 되면
Segments
Segment Name vmaddr vmsize fileoff filesize maxprot initprot nsects flags
---------------- -------- -------- -------- -------- -------- -------- -------- --------
__PAGEZERO 00000000 00004000 00000000 00000000 00000000 00000000 00000000 00000000
__TEXT 00004000 004d4000 00000000 00000000 00000005 00000005 0000000a 00000000
__DATA 004d8000 000d0000 00000000 00000000 00000003 00000003 00000014 00000000
__LINKEDIT 005a8000 00430000 00001000 00178270 00000001 00000001 00000000 00000000
__DWARF 009d8000 012e7000 0017a000 012e637b 00000007 00000003 0000000f 00000000
이렇게 나오는데 빨간색으로 표기한게 vmaddr이다.
위에서 vmaddr은 0x00004000 이다
저 주소를 있으면 주소를 계산하자.
위에 backtrace의 4번 라인을 가지고 symbol address를 구해보자.
0x3B465E = 0x00004000 + 0x0034665e - 0x6a000
symbol address는 0x3B465E다.
이제 이걸 dwarfdump에 넣어서 돌리자.
dwarfdump --arch=armv7 --lookup=0x3B465E TestApps/dSYM/
결과를 보다보면
0x008cdb2e: TAG_subprogram [78] *
AT_name( "-[AFHTTPClient initWithBaseURL:]" )
AT_decl_file( "/Users/5dolstory/Workspace/D TestAppsIphone/TestIphone/Pods/AFNetworking/AFNetworking/AFHTTPClient.m" )
AT_decl_line( 231 )
......
Line table dir : '/Users/5dolstory/Workspace/TestAppsIphone/TestIphone/Pods/AFNetworking/AFNetworking'
Line table file: 'AFHTTPClient.m' line 288, column 0 with start address 0x00000000003b4656
.........
이렇게 Line table 이 있는데 이게 crash가 난 위치고 AT decl file이 클래스 파일 위치고 AT name이 메소드명이다.
'개발 이야기' 카테고리의 다른 글
symbolication을 ubuntu에서 하기 (0) | 2015.06.17 |
---|