'symbolication dwarfdump'에 해당되는 글 1건

  1. 2015.01.30 iOS symbolication dwarfdump로 하기

iOS 심볼리케이션을 하려면 기본적으로 mac에서 debug모드로 하면 자동으로 된다.


개인 개발자면 별 문제가 없지만 nhn이나 skp, daumkakao 같이 다수의 앱을 서비스하는 회사에서는 iOS 앱의 크래쉬 정보를 서비스화 해서 전사 앱 개발을 하는데 도움을 주려고 시스템을 별도 구축한다.


몇가지를 보면 nhn의 ncrazer가 있고 skp는 crash logger라는 애고 daumkakao에는 moca crash report라는 시스템이 있다.


nhn ncrazer 


skp crash logger 
http://readme.skplanet.com/?p=5030 

daumkakao
음.. 따로 자료 안만듬..ㅎㅎ 나중에 만들어야 하는데..;

일단 요기까지 잡다한 설명은 제외하고 저런 서비스에서 iOS 심볼리케이션을 어떻게 할까?

대략 방법은 2가지다.
* xcode에서 기본적으로 제곡하는 symbolicatecrash를 이용하는 방법
* atos, otool, lipo, dwarfdump를 이용하는 방법


저건 모두 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
Posted by 서오석
,