2014-06-12 32 views
9

在iOS模擬器中運行的我的Swift應用程序正在運行時錯誤EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, sub code=0x0)的調試器中停止。在Swift標準庫中診斷EXC_BAD_INSTRUCTION

按照WWDC 2014 Session 409這通常是由於斷言失敗。

在Xcode中6的發展現狀Beta版,調試程序的堆棧跟蹤和上面的錯誤沒有提供足夠的信息,看看是什麼問題。我如何找出問題所在?

回答

5

看來,這個錯誤的最常見的來源(在寫這篇文章時:Xcode 6 Beta 1)是一些隱式解包可選屬性或變量是nil

爲了方便起見,最Objective-C的API被橋接到與斯威夫特implicitly unwrapped optionals。它們由感嘆號表示的類型聲明背後:AnyObject[]!

  • 如果調試器在你的代碼將停止,仔細檢查線路和尋找隱含展開自選,可能是nil那裏。

  • 有時調試器在Swift系統庫中的運行時錯誤會停止。例如,當您將封閉傳遞給像filtermapreduce等收集方法時,會發生這種情況。然後,運行時錯誤發生在這些庫函數的調用站點上,但是定義可能位於代碼的不同部分,您可以在其中定義函數/閉包。在那裏尋找可能在運行時爲零的隱式解包選項。

爲防止agains這類錯誤的認識,儘管斯威夫特編譯器不會強迫你來處理潛在的可可返回nil值,你應該使用optional bindingoptional chainingoptional downcasting無論從客觀的返回值-C地可能是nil

讓我們希望未來版本的Swift編譯器將開始爲這種常見類型的問題發出更多有用的診斷消息和錯誤!

+1

在Beta 3中,您現在將得到一個控制檯消息,其效果爲「隱式解包可選具有零值」。 –

3

我發現(幾個小時後),這個錯誤可能出現在錯誤的行上。

例如

enter image description here

正如你可以看到應用程序崩潰我在哪裏檢查爲零,但後來「繼續」通過,因爲它打印報表。然後它「倒退」並崩潰。

我得出的結論是,有在XCode中的源極 - 映射的錯誤(7)其中一個零變量是未纏繞。在這種情況下,我有一個變量(在我的代碼中更遠),這個變量是零並且被解包。

當然,問題是,編譯器沒有標誌,是無實際變量,它標記完全是另一回事。

所以,如果你碰到這個討厭的錯誤,經過所有可能的變量,可以是零,並檢查它們的展開。你可能會解開一個零,而不是編譯器說的那個。

正如在評論中提到的,有編譯器優化。這裏是一個鏈接來解決該問題(並找到墜毀的原因路線)

xcode 6.1 how to disable optimization (Swift)

+2

從你的描述來看,這聽起來像是你的崩潰發生在優化構建中,我猜測?如果是這樣,編譯器在優化過程中可能會執行一些代碼重新排序,所以... ;-) – Palimondo

+0

是的,關閉這種方式會導致實際需要補救的行 – Aggressor

0

我有同樣的問題,因爲Palimondo。幸運的是,這只是確保我已經提前初始化了這個項目。在我的代碼中,我調用了一個函數來將圖像放在UIImageViews中,並傳入一個數組中的元素。我還沒有加載我的數組與UIImageViews,因此,當代碼將運行它會說我傳入一個不存在的數組元素。一旦我確定在程序開始時加載我的陣列,錯誤就消失了。