笨辦法定位framework中的崩潰

用戶使用我們的framework,遇到了crash,反饋了下面的調(diào)用堆棧。

2016-08-06 19:36:33.390 FxxxxxxxxxxxGame[9647:2085565] Uncaught exception: NSRangeException: *** -[__NSArrayM insertObject:atIndex:]: index 1 beyond bounds for empty array
(
    0   CoreFoundation                      0x000000018247edc8 <redacted> + 148
    1   libobjc.A.dylib                     0x0000000181ae3f80 objc_exception_throw + 56
    2   CoreFoundation                      0x0000000182362708 CFStringConvertNSStringEncodingToEncoding + 0
    3   FxxxxxxxxxxxGame                    0x00000001003fea6c -[txhw264encoder doencoder:withDataLen:withFrameIndex:withSyncId:TimeStamp:] + 964
    4   FxxxxxxxxxxxGame                    0x00000001003d97d0 _ZN23txrtmp_hw264_ObjEncCall18objectiveCallDoDecEPhiiil + 100
    5   FxxxxxxxxxxxGame                    0x00000001003ff1a4 _ZN21txrtmp_hw264_Hd264Enc7DoCodecEPhiii + 48
    6   FxxxxxxxxxxxGame                    0x00000001003ea7c0 _ZN12CH264Encoder11EncodeFrameEiPhiijj + 684
    7   FxxxxxxxxxxxGame                    0x00000001003eda50 _ZN16CTXH264EncThread10threadLoopEv + 68
    8   FxxxxxxxxxxxGame                    0x00000001003efe0c _ZN15TXMessageThreadI16CTXH264EncThreadE11_threadLoopEPv + 80
    9   libsystem_pthread.dylib             0x00000001820e3b28 <redacted> + 156
    10  libsystem_pthread.dylib             0x00000001820e3a8c <redacted> + 0
    11  libsystem_pthread.dylib             0x00000001820e1028 thread_start + 4
)

這個(gè)調(diào)用棧已經(jīng)精確到函數(shù)。我們拿到這個(gè),已經(jīng)知道是-[txhw264encoder doencoder:withDataLen:withFrameIndex:withSyncId:TimeStamp:]這個(gè)函數(shù)觸發(fā)了異常,但是沒有指出來具體是那一行。

能定位到函數(shù),那是因?yàn)槲覀兊絝ramewrok的符號(hào)表有這個(gè)名字;他們沒有framewrok代碼,framewrok也沒有dSYM,定位不到具體的某行是正常的。

現(xiàn)在我們手頭上有用這個(gè)framework編的一個(gè)Demo,以及Demo的dSYM文件(事實(shí)上是這個(gè)Demo依賴了framework,當(dāng)自動(dòng)構(gòu)建編出Demo后,同時(shí)build的framewrok就直接拿來發(fā)布了)。能不能用這個(gè)來定位呢?
理論上說應(yīng)該是可以,因?yàn)閒ramewrok本身沒有變化,我們要的是-[txhw264encoder doencoder:withDataLen:withFrameIndex:withSyncId:TimeStamp:] + 964 指向的究竟是哪一行,這個(gè)偏移在Demo中并沒有發(fā)生變化。

現(xiàn)在問題來了,怎么知道-[txhw264encoder doencoder:withDataLen:withFrameIndex:withSyncId:TimeStamp:]在Demo中的偏移。搜索了一番后,發(fā)現(xiàn)dwarfdump這個(gè)工具可以幫忙做到

$dwarfdump --arch=arm64 --find "-[txhw264encoder doencoder:withDataLen:withFrameIndex:withSyncId:TimeStamp:]" RTMPiOSDemo.app.dSYM/Contents/Resources/DWARF/RTMPiOSDemo
----------------------------------------------------------------------
 File: RTMPiOSDemo.app.dSYM/Contents/Resources/DWARF/RTMPiOSDemo (arm64)
----------------------------------------------------------------------
Searching .debug_pubnames for '-[txhw264encoder doencoder:withDataLen:withFrameIndex:withSyncId:TimeStamp:]'... 1 match:

0x0021b78b: TAG_subprogram [152] *
             AT_low_pc( 0x000000010004d330 )
             AT_high_pc( 0x000000010004d820 )
             AT_frame_base( reg29 )
             AT_object_pointer( {0x0021b7af} )
             AT_name( "-[txhw264encoder doencoder:withDataLen:withFrameIndex:withSyncId:TimeStamp:]" )
             AT_decl_file( "/data/rdm/projects/24662/RTMPSDK/H264/HW264_iOS/hw264encoder.m" )
             AT_decl_line( 143 )
             AT_prototyped( 0x01 )
             AT_type( {0x0021b199} ( int ) )
             AT_APPLE_optimized( 0x01 )

AT_low_pc就是加載的偏移。用計(jì)算器手動(dòng)算一下:0x000000010004d330+960=0x10004D6F0

$atos -arch arm64 -o RTMPiOSDemo.app.dSYM/Contents/Resources/DWARF/RTMPiOSDemo 0x10004D6F0
-[txhw264encoder doencoder:withDataLen:withFrameIndex:withSyncId:TimeStamp:] (in RTMPiOSDemo) (hw264encoder.m:231)

定位到具體的行了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Swift版本點(diǎn)擊這里歡迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh閱讀 26,259評(píng)論 7 249
  • 該文章屬于劉小壯原創(chuàng),轉(zhuǎn)載請(qǐng)注明:劉小壯[http://www.itdecent.cn/u/2de707c93d...
    劉小壯閱讀 38,090評(píng)論 45 121
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,636評(píng)論 4 61
  • 復(fù)用類的方法:1、在新的類中產(chǎn)生現(xiàn)有類的對(duì)象,所以新的類由現(xiàn)有類的對(duì)象組成,這種方法為組合2、按照現(xiàn)有類的類型來創(chuàng)...
    whyshang閱讀 415評(píng)論 0 0
  • Elliequeen閱讀 148評(píng)論 0 0

友情鏈接更多精彩內(nèi)容