2012-03-29 67 views
5

我的應用程序僅在未使用XCode調試器運行時崩潰。很難追蹤,因爲我無法調試,但我終於明白了。這是因爲在某些不屬於我的物體上發佈了釋放。之前我糾正它,我搜查,發現這裏2個相關的問題(下面的鏈接)只有在沒有通過XCode運行時纔會崩潰。 Concidence?

iOS App Crashes when running by itself on device, does not crash when running through Xcode using debugger, or in simulator

iPhone crash only when device not connected to xcode, how to understand the crash log?

上述問題均沒有回答爲什麼沒有崩潰通過debugger.So運行時,我的問題是,爲什麼它發生?我知道調試/發佈特定崩潰的原因,但這很瘋狂。這是偶然的,雖然它發生了10次以上。

+0

您是否嘗試過啓用殭屍分析? – CodaFi 2012-03-29 18:42:57

+0

不,但我想通過尋找dealloc方法,我發送釋放消息給殭屍對象。 – msk 2012-03-29 18:49:03

回答

2

你所描述的並不是非典型的與內存相關的晦澀問題。你可能也想在這種時候使用debug-malloc。雖然這不能保證找到一切。原因(可能只要存在源代碼級調試器就會發生)是因爲內存在可調試代碼中以及在調試器下運行時至少有點不同。所以在調試器下,錯誤會導致不同的內存被損壞(無害地)。當不在調試器下時,被損壞的位置實際上是代碼關心的東西,並且它崩潰了。

也可能發生相反的情況,但是您永遠不會知道 - 如果在運行可調試時崩潰,在切換到調試環境之外運行之前,您會發現它。

0

我從[[NSBundle mainBundle] resourcePath]目錄之外訪問SQLite數據庫時出現此問題,這導致了iCloud錯誤。

我發現錯誤只有通過安裝控制檯到我的iPhone記錄錯誤。

http://itunes.apple.com/us/app/console/id317676250

有一次,我從正確的目錄訪問的數據庫,錯誤消失,應用正確引導。

0

當我創建一個NSString時,我經歷了這種症狀,從它發送一個UTF8String到另一個對象,並將它分配給一個字符指針。那麼,事實證明,我忘了保留原來的NSString,這無關緊要,因爲我也沒有意識到UTF8String方法(它可能是一個訪問指針本身的對象)在autorelease中運行池。也就是說,保留NSString本身並不能解決問題。

我想這似乎工作得很好,因爲我有殭屍啓用,因此我有的指針仍然有效。我應該看看這是否是它工作的原因;如果是這樣,這是一個很好的理由來測試啓用和不啓用NSZombie。

無論如何,這可能是糟糕的設計開始,而且一旦我找到它,一個非常明顯的新手內存管理錯誤。幸運的是,組織者窗口中的控制檯給了我一些關於從哪裏開始尋找的提示,調試最終向我展示了指針的值在哪裏變化。希望這有助於任何在這裏找到方法的人。

0

我當時也遇到了這個問題,很幸運很快找出原因,希望能在這裏發帖,我可以省去別人一些浪費時間。爲了澄清,我的應用程序直接從XCode啓動時運行時沒有問題,但在iPad上手動啓動時會立即崩潰。

有問題的應用程序是用Obj-C編寫的,但依賴於用Swift編寫的一些第三方代碼。 Swift代碼作爲嵌入式框架包含在應用程序中。我必須在應用程序的構建設置中將「嵌入式內容包含Swift代碼」設置爲「是」(在「構建選項」下),然後問題就消失了。