2013-11-02 87 views
23

我收到了一條錯誤如何調試EXC_BAD_ACCESS錯誤

EXC_BAD_ACCESS碼= 2 at0xb0987654

我想知道如何在0xb0987654打印出來的價值?

+0

我想在這個地址,你不想打印出來的值,因爲這很地址是擺在首位你的問題。什麼*讓你在那裏*是要問的問題。 – Jay

回答

30

要調試EXC_BAD_ACCESS,通常可以通過啓用殭屍對象來找出懸掛指針的位置。

的Xcode

選擇編輯方案,在運行部分則診斷選項卡,然後單擊「殭屍對象」選項。

AppCode

選擇編輯目標,並添加以下環境變量:

NSZombieEnabled=YES 

爲EXC_BAD_ACCESS另一個原因可以是無限遞歸,其可以通過加入一些測井中找到。

更新C++:

要調試懸空在C指針++與鏘編譯器嘗試使用Address Sanitizer (ASAN)來自谷歌。

+2

我試過了,沒用。因爲它是導致問題的C++代碼。 –

+0

@AdamLee然後呢? http://stackoverflow.com/questions/3199067/c-catching-dangling-reference –

+0

@AdamLee,Oops看起來像MudFlap是gcc只,更新爲Clang/llvm –

2

它看起來像也許你正試圖寫入代碼頁或什麼? EXC_BAD_ACCESS在/usr/include/mach/exception_types.h描述:做

#define KERN_PROTECTION_FAILURE   2 
      /* Specified memory is valid, but does not permit the 
      * required forms of access. 
      */ 

你可以看到該地址是在您的二進制文件:

#define EXC_BAD_ACCESS   1  /* Could not access memory */ 
      /* Code contains kern_return_t describing error. */ 
      /* Subcode contains bad memory address. */ 

而且從kern_return.h

(lldb) image lookup -va 0xb0987654 

但是你真正需要弄清楚的是誰在試圖寫在那裏。如果問題很簡單,這可能會告訴你什麼是錯誤的,但正如賈斯珀所說,這可能是一些免費使用或其他類似問題,並且在你崩潰的時候,這個壞角色早已消失。 guardmalloc有時也會遇到這種錯誤(您可以在運行方案的Xcode中啓用此功能。)

+7

'在lldb中,圖像查找-va 0x1586470c4'完全沒有輸出,甚至沒有輸出錯誤信息。 –

+0

目前,「圖像查找-a」只是在給定的地址打印它可以找到的內容,即使在「沒有符號在這個地址」的情況下,當這是沒有的時候......當LLDB不能打印時,它應該打印一些錯誤找到與給定地址關聯的任何符號。請用Apple的bug記者或lldb.llvm.org bugzilla提交一份關於此問題的bug。謝謝。 –

0

確定您做了什麼導致了崩潰。在特定視圖控制器的視圖執行加載或委託方法或特定操作時,它是否崩潰?這通常會幫助找到產生錯誤的對象。

  • 大部分時間「NSZombies」都可以幫助識別死對象。您可以通過編輯您的方案產品 - >編輯方案 - >診斷來啓用NSZombies。
  • 如果仍然沒有找到根本原因,那麼總是從子視圖控制器向後返回到父視圖控制器,以查看需要保留哪些對象或需要正確傳遞哪些消息。
  • 查看靜態分析儀和儀器進行高級調試。

我希望這會幫助你。

問候, 吉生