原文地址:http://www.acwind.net/blog/?p=1090
Bug是永遠伴隨著程序員們的東西,各種各樣的情況造成程序crash掉也是家常便飯。Windows下的很多大型軟件在崩潰的時候,都會彈出提示框,詢問用戶是否將crash的信息發送到軟件廠商,以供軟件開發商debug。App store中的軟件也有這個功能,用戶在使用軟件的時候,如果程序崩潰,錯誤信息會發送到Apple的服務器中,軟件的開發者們可以很方便在后臺獲得自己程序的crash log,供自己調試。
但隨之而來的問題是,我們收到的程序崩潰調試信息多半是匯編語言一樣的堆棧代碼,同時這些信息并不是在我們debug的時候產生,所以看到這一串crash log的天書,常常無可奈何。Xcode很好的解決了這一問題,它所提供的Orgainzer分析器加上symbolicatecrash?,可以分析二進制文件以及源代碼和crashlog之間的連接,直接找出源程序中出錯的代碼行。方法網上到處是,本文不討論。
但是如果使用symbolicatecrash?無法定位到出錯的代碼行的話,怎么整呢?有一個辦法,如下:
首先查看crash log中的崩潰線程,假如是這樣的:
Thread 0 Crashed:
0 libobjc.A.dylib 0x00003ec0 objc_msgSend + 24
1 MyApp 0x000036d2 0×1000 + 9938?
我們得到了用戶發生崩潰情況的內存地址:0x000036d2?
然后回到我們應用程序的build目錄,目錄下一定要包含MyApp.app 和MyApp.app.dSYM兩個文件。
在控制臺使用dwarfdump命令,解析出內存地址,如:
dwarfdump –lookup 0x000036d2 –arch armv6 MyApp.app.dSYM
輸出信息如下:
直接定位到代碼的出錯行,Cool!