手動(dòng)解析App dSYM示例

前期準(zhǔn)備

  1. 崩潰日志地址(涉及敏感數(shù)據(jù)已屏蔽)
  2. 對(duì)應(yīng)app 的 dSYM文件华临,利用dwarfdump --uuid <file_to_detect>檢測(cè)dSYM文件uuid和app執(zhí)行文件uuid是否匹配
$ dwarfdump --uuid APP_BUNDLE_NAME.app.dSYM

UUID: F181E27B-CE37-3525-93FD-DC3A16827D20 (armv7) APP_BUNDLE_NAME.app.dSYM/Contents/Resources/DWARF/APP_BUNDLE_NAME
UUID: 3D16DCD2-749C-3D41-BEF1-333E55AA28BB (arm64) APP_BUNDLE_NAME.app.dSYM/Contents/Resources/DWARF/APP_BUNDLE_NAME

$ dwarfdump --uuid APP_BUNDLE_NAME/Payload/APP_BUNDLE_NAME.app/APP_BUNDLE_NAME 

UUID: F181E27B-CE37-3525-93FD-DC3A16827D20 (armv7) APP_BUNDLE_NAME/Payload/APP_BUNDLE_NAME.app/APP_BUNDLE_NAME
UUID: 3D16DCD2-749C-3D41-BEF1-333E55AA28BB (arm64) APP_BUNDLE_NAME/Payload/APP_BUNDLE_NAME.app/APP_BUNDLE_NAME

出錯(cuò)堆棧

0 libobjc.A.dylib   0x00000001941bbbdc objc_msgSend + 28
1 UIKit 0x00000001885f0f74 0x00000001881fc000 + 4149108
2 UIKit 0x00000001882e5bec 0x00000001881fc000 + 957420
3 UIKit 0x00000001882e5960 0x00000001881fc000 + 956768
4 UIKit 0x00000001882ec5e0 0x00000001881fc000 + 984544
5 UIKit 0x00000001882095f8 0x00000001881fc000 + 54776
6 UIKit 0x000000018822aa34 0x00000001881fc000 + 191028
7 UIKit 0x0000000188209310 0x00000001881fc000 + 54032
8 UIKit 0x0000000188209310 0x00000001881fc000 + 54032
9 UIKit 0x000000018822aa34 0x00000001881fc000 + 191028
10 UIKit    0x0000000188209310 0x00000001881fc000 + 54032
11 UIKit    0x0000000188209310 0x00000001881fc000 + 54032
12 UIKit    0x0000000188209310 0x00000001881fc000 + 54032
13 UIKit    0x0000000188209310 0x00000001881fc000 + 54032
14 UIKit    0x0000000188209310 0x00000001881fc000 + 54032
15 UIKit    0x0000000188209310 0x00000001881fc000 + 54032
16 UIKit    0x00000001882089e0 0x00000001881fc000 + 51680
17 Foundation   0x0000000184891908 0x000000018483c000 + 350472
18 UIKit    0x00000001882088a0 0x00000001881fc000 + 51360
19 UIKit    0x00000001882143a0 0x00000001881fc000 + 99232
20 UIKit    0x00000001883000b0 0x00000001881fc000 + 1065136
21 UIKit    0x0000000188344128 0x00000001881fc000 + 1343784
22 UIKit    0x00000001883439f0 0x00000001881fc000 + 1341936
23 UIKit    0x000000018840d5c4 0x00000001881fc000 + 2168260
24 UIKit    0x0000000188241418 0x00000001881fc000 + 283672
25 UIKit    0x000000018840d430 0x00000001881fc000 + 2167856
26 UIKit    0x0000000188241418 0x00000001881fc000 + 283672
27 UIKit    0x000000018822a52c 0x00000001881fc000 + 189740
28 UIKit    0x000000018840d068 0x00000001881fc000 + 2166888
29 UIKit    0x0000000188241418 0x00000001881fc000 + 283672
30 UIKit    0x000000018822a52c 0x00000001881fc000 + 189740
31 UIKit    0x0000000188240db4 0x00000001881fc000 + 282036
32 UIKit    0x0000000188200750 0x00000001881fc000 + 18256
33 CoreFoundation   0x0000000183a16a50 0x0000000183938000 + 911952
34 CoreFoundation   0x0000000183a139dc 0x0000000183938000 + 899548
35 CoreFoundation   0x0000000183a13dbc 0x0000000183938000 + 900540
36 CoreFoundation   0x00000001839410a4 CFRunLoopRunSpecific + 396
37 GraphicsServices 0x000000018cadb5a4 GSEventRunModal + 168
38 UIKit    0x0000000188272aa4 UIApplicationMain + 1488
39 APP_BUNDLE_NAME  0x0000000100327938 0x00000001000a0000 + 2652472
40 libdyld.dylib    0x0000000194816a08 0x0000000194814000 + 10760

分析數(shù)據(jù)

  • Stack Address(棧地址): 0x0000000100327938
  • Load Address(首地址): 0x00000001000a0000
  • Slide Value(32位虛擬地址): 0x00004000
  • Slide Value(64位虛擬地址): 0x0000000100000000
  • Symbol Offset(偏移量): 2652472
  • File Address(32位文件地址): 0x28B938
  • File Address(64位文件地址): 0x100287938

注意虛擬地址區(qū)分32位(LC_SEGMENT)和64位(LC_SEGMENT_64)段的不同

數(shù)據(jù)關(guān)系說(shuō)明

數(shù)據(jù)關(guān)系說(shuō)明

獲取虛擬地址

對(duì)于 ATOS,它會(huì)主動(dòng)幫你計(jì)算虛擬地址扶供,只要你提供了首地址和棧地址;對(duì)于 dwarfdumplldb 而言顽染,它們需要使用文件地址,所以還需要虛擬地址粉寞。我們可以使用 otool來(lái)獲取 dSYM 文件中的虛擬地址左腔。

$ otool -l APP_BUNDLE_NAME.app.dSYM/Contents/Resources/DWARF/APP_BUNDLE_NAME

     ...
Load command 3
      cmd LC_SEGMENT
  cmdsize 736
  segname __TEXT
   vmaddr 0x00004000
   vmsize 0x00c3c000
  fileoff 0
 filesize 0
  maxprot 0x00000005
 initprot 0x00000005
   nsects 10
    flags 0x0
     ...
Load command 3
      cmd LC_SEGMENT_64
  cmdsize 952
  segname __TEXT
   vmaddr 0x0000000100000000
   vmsize 0x0000000000d94000
  fileoff 0
 filesize 0
  maxprot 0x00000005
 initprot 0x00000005
   nsects 11
    flags 0x0
     ...

使用ATOS進(jìn)行符號(hào)化

atos -arch \<architecture\> -o \<binary filename\> -l \<load address\> \<stack address 1\> \<stack address 2\> ...

$ atos -arch arm64 -o APP_BUNDLE_NAME.app.dSYM/Contents/Resources/DWARF/APP_BUNDLE_NAME 
-l 0x00000001000a0000 0x0000000100327938

main (in ) (main.m:14)

使用lldb進(jìn)行符號(hào)化

(lldb) target create --arch arm64 ./APP_BUNDLE_NAME.app.dSYM/Contents/Resources/DWARF/APP_BUNDLE_NAME

Current executable set to './APP_BUNDLE_NAME.app.dSYM/Contents/Resources/DWARF/APP_BUNDLE_NAME' (arm64).

(lldb) image lookup --address 0x100287938

      Address: APP_BUNDLE_NAME[0x0000000100287938] (APP_BUNDLE_NAME.__TEXT.__text + 2632468)
      Summary: APP_BUNDLE_NAME`main + 88 at main.m:14

使用dwarfdump進(jìn)行符號(hào)化

$ dwarfdump --lookup 0x100287938 --arch arm64 APP_BUNDLE_NAME.app.dSYM

----------------------------------------------------------------------
 File: APP_BUNDLE_NAME.app.dSYM/Contents/Resources/DWARF/APP_BUNDLE_NAME (arm64)
----------------------------------------------------------------------
Looking up address: 0x0000000100287938 in .debug_info... found!

0x002942c4: Compile Unit: length = 0x0000024d  version = 0x0002  
abbr_offset = 0x00000000  addr_size = 0x08  (next CU at 0x00294515)

0x002942cf: TAG_compile_unit [106] *
             AT_producer( "Apple LLVM version 8.1.0 (clang-802.0.38)" )
             AT_language( DW_LANG_ObjC )
             AT_name( "/Users/user/APP_PROJECT_NAME/APP_PROJECT_NAME/main.m" )
             AT_stmt_list( 0x00128d9d )
             AT_comp_dir( "/Users/user/APP_PROJECT_NAME" )
             AT_APPLE_optimized( 0x01 )
             AT_APPLE_major_runtime_vers( 0x02 )
             AT_low_pc( 0x00000001002878d8 )
             AT_high_pc( 0x0000000100287960 )

0x00294480:     TAG_subprogram [226] *
                 AT_low_pc( 0x00000001002878e0 )
                 AT_high_pc( 0x0000000100287960 )
                 AT_frame_base( reg29 )
                 AT_name( "main" )
                 AT_decl_file( "/Users/user/APP_PROJECT_NAME/APP_PROJECT_NAME/main.m" )
                 AT_decl_line( 12 )
                 AT_prototyped( 0x01 )
                 AT_type( {0x002944c7} ( int ) )
                 AT_external( 0x01 )
                 AT_APPLE_optimized( 0x01 )
Line table dir : '/Users/user/APP_PROJECT_NAME/APP_PROJECT_NAME'
Line table file: 'main.m' line 14, column 16 with start address 0x0000000100287924

Looking up address: 0x0000000100287938 in .debug_frame... not found.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市鞭莽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌褒搔,老刑警劉巖喷面,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異琳状,居然都是意外死亡盒齿,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門边翁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人审洞,你說(shuō)我怎么就攤上這事待讳。” “怎么了创淡?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵琳彩,是天一觀的道長(zhǎng)部凑。 經(jīng)常有香客問(wèn)我碧浊,道長(zhǎng),這世上最難降的妖魔是什么箱锐? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮浩聋,結(jié)果婚禮上臊恋,老公的妹妹穿的比我還像新娘。我一直安慰自己抖仅,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布践樱。 她就那樣靜靜地躺著凸丸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瞭稼。 梳的紋絲不亂的頭發(fā)上腻惠,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音集灌,去河邊找鬼。 笑死腌零,一個(gè)胖子當(dāng)著我的面吹牛唆阿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播驯鳖,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼扭弧!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起鸽捻,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤泊愧,失蹤者是張志新(化名)和其女友劉穎盛正,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體豪筝,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年敲街,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了严望。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡峻黍,死狀恐怖拨匆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情惭每,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布宏赘,位于F島的核電站览爵,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蜓竹。R本人自食惡果不足惜储藐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一嘶是、第九天 我趴在偏房一處隱蔽的房頂上張望钙勃。 院中可真熱鬧,春花似錦聂喇、人聲如沸辖源。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)克饶。三九已至,卻和暖如春誊辉,著一層夾襖步出監(jiān)牢的瞬間矾湃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工堕澄, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留邀跃,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓拍屑,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親坑傅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子僵驰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)裁蚁,斷路器矢渊,智...
    卡卡羅2017閱讀 134,656評(píng)論 18 139
  • 13.1 Objective-C消息傳遞(Messaging) 對(duì)于C/C++這類靜態(tài)語(yǔ)言,調(diào)用一個(gè)方法其實(shí)就是跳...
    泰克2008閱讀 2,018評(píng)論 1 6
  • 13. Hook原理介紹 13.1 Objective-C消息傳遞(Messaging) 對(duì)于C/C++這類靜態(tài)語(yǔ)...
    Flonger閱讀 1,413評(píng)論 0 3
  • Determining Whether a Crash Report is Symbolicated(決定是否符號(hào)...
    helinyu閱讀 1,435評(píng)論 0 1
  • iOS開發(fā)中,對(duì)于線上版本或公測(cè)版本產(chǎn)生的crash室谚,我們可以通過(guò)結(jié)合.app 毡鉴,.dSYM 及 crash lo...
    lele8446閱讀 2,243評(píng)論 2 5