本文在源文的基礎上作整理:http://www.devdiv.com/home.php?mod=space&uid=50901&do=blog&id=50856php
Xcode版本7.1 IOS版本9.1測試
公司以前開發的一個APP,在使用環境中IOS版本升級到9.0之後,某個操做會致使程序閃退。ui
Xcode代碼中提示錯誤:spa
Thread 1: Program received signal:"EXC_BAD_ACCESS"
這樣的提示意味着對已經釋放的對象發送消息,或者對不能release的對象調用release。3d
默認狀況下Xcode並不能準肯定位到具體哪行代碼引發的問題。調試
咱們先對開發環境進行設置日誌
先打開Debug的Console View界面,讓Xcode在調試的時候輸出更多的信息:菜單XCode > Preferencescode
再對環境變量進行設置:菜單Product > Scheme > Edit Scheme對象
設置好後調試程序,在輸出界面發現了message sent to deallocated instance錯誤日誌blog
在Xcode的之前版本中,咱們能夠在Xcode的Console View中使用info malloc-history 0x6d564f0來查看調用堆棧來查看崩潰發生的地方。
在新的Xcode中,調試器默認使用的LLDB,那麼怎麼在LLDB狀態下定位因爲內存操做不當引發的Crash呢?
打開「活動監視器」,在進程列表中找到測試APP對應的進程號PID(Xcode啓用調試後會在進程列表中找到對應APP的進程)
如今咱們獲得兩個主要的信息:
APP進程ID:1087
崩潰地址:0x7f7f7523ff10
打開「終端」,輸入如下命令:
sudo malloc_history 1087 0x7f7f7523ff10
獲得錯誤日誌,這樣就能定位到最後調用的那行代碼
downLoadBtns是咱們自定義的一個方法,在這個方法內部對新構建的UIButton作釋放,它就是引發崩潰的元兇。
[btn release];