2017-08-25 76 views
-1

我遇到內存問題。我收到一條錯誤消息「線程1:EXC_BAD_ACCESS(code = 1,address = ...)該錯誤是難以捉摸的,顯然取決於時間。在我的iPad mini上,它平均每次平均約3分鐘,在我的iPhone SE平均10分鐘,並在模擬器上運行20小時而不會崩潰。內存錯誤的可能原因

我沒有成功地使用殭屍探測器。 (請參閱下文,瞭解我的經驗。)因此,我正在試着用細梳梳理我的代碼,以查看可能導致崩潰的原因。什麼是可能導致分配錯誤的問題?

我的應用程序是多線程的。它從麥克風發出聲音,對其進行處理,並不斷用顯示的處理結果更新顯示。它是用Swift 3編寫的,所以我沒有做任何明確的malloc或釋放。

我正在尋找可能導致錯誤的代碼中的地方。我最近看到的兩件事是弱引用和不安全的指針。是否還有其他常見編程錯誤可能會讓我感到不安?我們已經忽略了這個警告,並且試圖用我的我的模擬器來試試這個警告。 iPad mini,我無法讓它崩潰,一切都以大約1/10的速度運行,當我暫停錄製時,我的OSX機器也變得呆滯,一次顯示幾分鐘的旋轉「等待」光標。總的內存分配是上下調整的,但是保持在限制範圍內,所以沒有大的內存泄漏,我也在模擬器上運行了殭屍工具,它同樣很低速,但仍然沒有崩潰。)

+0

你是否能夠在調試器中捕捉到崩潰?有堆棧嗎?你有沒有將「self」捕獲爲「無主」的塊? –

+0

是的,它顯示在調試器中。這裏是它的代碼吧 'let loByte = bytes [pos]' 'let hiByte = bytes [pos + 1] // break here' 實際值有所不同,但這最後一次pos是630.沒有什麼不尋常的關於字節或字節的第630和第631個元素的調試器。 –

回答

0

這種情況下的問題證明是線程安全。如果我在一個線程上設置一個UInt8變量並在另一個線程上讀取它,它可能會導致內存錯誤。制定者和獲得者不是線程安全的。 (我一直在編程計算機的大部分職業生涯,主要是C,C++和Java。我熟悉這些語言中的多線程問題,我是Swift 3的新手。它只是簡單的到目前爲止我還沒有想到設置和獲取數字變量不是原子操作 - 一個錯誤的訪問可能會導致程序崩潰,我將不得不徹底重新思考我的併發Swift方法。 )

相關問題