Xcode做ios開發時 message sent to deallocated instance問題的解決方法(gdb和lldb)

1、添加MallocStackLoggingNoCompact,NSZombieEnabled,MallocStackLogging三個變量並且值全爲YES

    當出現message sent to deallocated instance的時候,一般伴隨牛逼的BAD_ACCESS.是的,是某個對象release了兩次。可是那麼多的疑似對象,到底是哪一個?

    使用xcode環境變量(添加方法請自行google)MallocStackLoggingNoCompact,NSZombieEnabled,MallocStackLogging這三個,值都設置成YES.尋求更詳細的錯誤信息。

    message sent to deallocated instance後會有一個內存地址,如:0×6497860,我們需要查看該地址的malloc history.查看方法,在原來的gdb下,使用”info malloc_history 0×6497860“即可顯示malloc記錄。但是新版的Xcode 不再支持,怎麼辦呢?秀逗麻袋,我們還有terminal,使用終端的malloc_history命令,如”malloc_history 32009 0×6497860“即可顯示。其中的32009是該進程的pid,根據這個malloc記錄,可以大致定位出錯信息的代碼位置。

    2、在Terminal中 輸入

malloc_history 32009 0xc9313d0 |grep 0xc9313d0

    會出現類似以下提示代碼,根據提示就可以找出錯誤具體位置

ALLOC 0xfcdff50-0xfce00b7 [size=360]: thread_3bf2a28 |start | main | UIApplicationMain | GSEventRun | GSEventRunModal | CFRunLoopRunInMode | CFRunLoopRunSpecific | __CFRunLoopRun | __CFRunLoopDoObservers | __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ | _afterCACommitHandler | _applyBlockToCFArrayCopiedToStack | ___afterCACommitHandler_block_invoke | __38-[UITableView touchesEnded:withEvent:]_block_invoke | -[UITableView _userSelectRowAtPendingSelectionIndexPath:] | -[UITableView _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:] | -[MessageListViewController tableView:didSelectRowAtIndexPath:] | _objc_rootAlloc | class_createInstance | calloc | malloc_zone_calloc
發佈了2 篇原創文章 · 獲贊 1 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章