2014-09-30 19 views
45

我正在使用Xcode 6(GM,我沒有下載beta),並且正在開發用於iOS 7+的應用程序。對於我所有的項目,我只是打開了我在Xcode 5中使用過的相同項目。Xcode在iOS 8中的Main()中引發異常,並帶有'all exceptions'斷點

在Breakpoint導航器中,我打開了All Exceptions斷點。它設置爲Break: On Throw。現在,每次運行我的應用程序(無論是在設備上還是在模擬器中),它都會在main()函數中的行return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));上停止執行。

如果按Play繼續執行兩次程序,程序運行良好。所以這並不妨礙我的工作,但是每次都必須手動播放執行程序並重置我的編輯器令人討厭。

我喜歡我在Xcode中設置的行爲(將當前編輯器放到執行暫停的位置),並且該斷點對於IMO來說非常重要。 (所以我不想改變這些)

通過運行相同的代碼,以相同的環境,對於iOS 7目標(同樣,設備或模擬器),不引發異常。

任何線索可能會導致這種奇怪的行爲?

+0

我發現'Xcode中相同的行爲6.0.1'但我無法找出原因,它的背後!也許它的某種錯誤! – 2014-09-30 18:00:32

+5

如果從「所有異常」更改爲「Objective-C異常」,問題是否消失? – Tim 2014-09-30 18:13:40

+0

是的!我在模擬器中測試過一次,並在設備上測試過一次。任何想法爲什麼?請寫下這個答案。 – invalidArgument 2014-09-30 18:28:01

回答

93

如註釋中所述,您應該通過編輯您的所有異常斷點來關閉捕獲C++異常。

爲了做到這一點,右鍵點擊您的斷點,然後從所有Objective-C的改變異常

change All to Objective-C

異常的C++代碼的一部分正常的應用程序功能。但是,異常斷點並不捕捉未處理的內容,而是每次引發的異常,即使稍後它們被正確處理,也會停止執行。

27

TLDR;在我的情況下,問題的原因是缺少字體。

我也有這個問題。雖然@Johnnywho是正確的,只留下Objective-C的異常斷點,但可以阻止不需要的行爲,但它仍不能解釋什麼是真正的原因,爲什麼它在iOS7上無一例外地運行,爲什麼這隻會發生在某些項目上。

這就是爲什麼我繼續解剖我的一個項目,在這個項目中我遇到了這個問題,直到我找到原因爲止。我想這種行爲可能有多個原因,但在我的情況下,缺少自定義字體。

快速的方法來測試它:

  1. 開始一個新的單一視圖項目

  2. 上所有異常啓用斷點,包括C++(斷點/ + /添加例外斷點)

  3. 拖入項目中的一些自定義字體(允許複製並檢查目標添加到)

  4. 標籤添加到視圖主視圖控制器

  5. 選擇適合您標籤的自定義字體(在Xcode中6+應該在字體的選擇,只要你將它拖動到項目中顯示)。

  6. 運行應用程序並確認您看到自定義字體中的標籤(似乎我們不需要在Info.plist中爲「應用程序提供的字體」鍵添加字體文件名,if自定義字體已用於應用程序的xib的故事板中)。

  7. 現在(通過取消勾選目標的關係,或在目標設置中刪除它/構建階段/複製包資源)從項目中刪除自定義字體

  8. 從設備上刪除或SIM應用(刪除從應用程序包的字體文件)

  9. 產品/清潔

  10. 再次運行應用程序(即現在的標籤仍然有參考自定義字體,但該應用程序不會有這方面的文件)。如果您在iOS8上運行,您應該注意到這個神祕的異常。

  11. 在設備上運行iOS7或SIM卡與iOS7(您需要將iOS部署目標更改爲iOS7)。雖然標籤不會顯示自定義字體,但不會有例外。

  12. 將字體文件添加回目標,斷點不再停止運行。

所以我的結論是,在iOS8上丟失的字體會導致C++異常,而在iOS7上它們不會,因此會觸發斷點。

類似的異常(和斷點觸發器)也可能由Info.plist文件中錯誤地寫入「應用程序提供的字體」下的字體文件名引起。

+2

謝謝,我很厭倦聽到人們說要忽略它,切換到Objective-C。我想修復這個錯誤並不掩飾它,這讓我的眼睛看到了一個我應該注意的問題,並解決了我的問題,謝謝。我有半個神經投下了所有答案,說只能將它切換到objective-c。 – 2016-01-25 20:55:44

+0

準確地說,當時間允許時,我也更喜歡挖掘原因而不是處理症狀。 – 2016-01-27 09:18:40

+0

感謝您的支持!在我的情況下,當我將字體添加到我的info.plist中時,我忘記了文件擴展名。所以萬一它會幫助別人,我想我會在這裏提到它。 (另外這裏是我找到截圖的鏈接,這個截圖揭示了我需要包含文件擴展名的完整文件名http://codewithchris.com/common-mistakes-with-adding-custom-fonts- to-your-ios-app /) – CodenameDuchess 2016-08-02 17:44:40

3

剛剛總結了以前的答案,幫助我解決它。

問題:當您添加自定義字體,然後顯然刪除(替換)它,地方項目依然是他的參考和斷點主要的C++的lib斷點停止停止幾次的iOS 8

解決方案

1)在項目中查找並刪除(替換)所有對這些字體的引用。可能在一些筆尖,子模塊等...

2)如果你無法在任何地方修復(例如,只讀的庫使用它們)或者解決方案1後問題仍然存在,將這些舊字體添加回項目

3)忽略它 - 它是C++ lib,因此只將斷點異常從「全部」更改爲「Objective-C」

2

的Xcode 9,有時也有被拋出,但iOS版優雅捕獲它的例外。這將有助於

enter image description here

enter image description here

source

對我來說,這是一個筆尖的自定義屬性

+0

真是個不錯的訣竅!感謝分享!調試會話中是否有任何暗示你在po'ing'''arg1'''上?假設這個變量不是零,你會嘗試'''po $ arg2'''嗎? – invalidArgument 2017-12-05 13:26:28

相關問題