2010-03-30 161 views
1

我正在使用的一個項目在使用發佈配置構建時崩潰。iPhone發佈版本崩潰

我們需要將應用程序發送給蘋果進行審查,甚至在進入應用程序之前它都會崩潰。

任何想法如何發生?

在上次重新調整時,是否可以通過一些優化向蘋果發送調試版本的應用程序?

謝謝。

+0

您是否嘗試過使用Xcode調試器執行應用程序? – 2010-03-30 13:28:52

+0

我無法調試該應用的發佈版本。 有沒有辦法? – clide313 2010-03-30 13:38:25

回答

1

構建我的第一個iPhone應用程序時發生同樣的事情 - 在從調試切換到釋放應用程序之後,一段時間處理該項目一段時間後會崩潰。我做了一個完整的重建項目,從測試手機中刪除了應用程序並重新安裝了它,然後應用程序運行。它看起來像XCode有時不清理/重建所需的一切。

+0

感謝您的建議,也會嘗試一個,希望這會像您解釋的那樣簡單。 – clide313 2010-03-30 13:41:58

+0

這可能是對的,但如果底層原因是內存泄漏或其他與內存/指針有關的問題,也可能是紅色鯡魚,因爲在清理之後,內存中的內容會稍微不同。 – 2010-03-30 13:48:57

+0

感謝您的幫助。 使它工作起來要困難得多,但現在它正在工作。 我做了很多事情,我不知道什麼解決方案很實用。 但因爲我沒有更改任何代碼行,所以我將您的解決方案標記爲已接受。 – clide313 2010-04-02 15:12:07

0

如果使用發佈配置進行構建,請確保保留.dSYM文件和應用程序包的副本。

然後當應用程序在設備上崩潰時,將其插入Xcode並下載崩潰報告。

打開Xcode,然後從Xcode中打開管理器。從那裏你可以查看設備的崩潰報告。

當且僅當您保存.dSYM文件和應用程序包時,崩潰報告將被符號化。

然後,您可以使用崩潰報告查明崩潰原因並進行修復。

0

你應該看看你的崩潰日誌。打開管理器,選擇您的設備,然後選擇「崩潰日誌」選項卡。向下滾動查找您的應用程序的日誌。應該是符號化的,所以你可以看到堆棧跟蹤。

沒有真正調試你的應用程序,真的很難說更多。你使用#ifdef DEBUG宏嗎?你使用多個線程?如果你有一堆NSLog語句會在調試模式下減慢執行速度,這可能會引入微妙的時間差異,從而影響多線程應用程序。

您是否在您的調試版本上嘗試了'make clean'?當您的項目部分重建而其他部分未更改時,隱藏的錯誤可能會隱藏。

+0

將查看崩潰日誌。 我沒有在任何地方使用#ifdef,是的,我有一個多線程程序(但我確信任何數據修改是在主線程中進行的),線程不直接通信。 – clide313 2010-03-30 13:41:02

+0

這將走很長的路。請謹慎閱讀來自輔助線程的數據。即使你使用的是NSLock,或者只從主線程寫入數據,也不要在從輔助線程讀取時做出假設。例如,在使用它之前檢查你需要的對象實際上是否存在。主線程在您的輔助線程訪問它時可能已經釋放它。這些類型的時序錯誤可以避免在較慢的調試代碼中檢測到,但是在釋放代碼中卻會讓他們看起來醜陋。 克里斯關於下面使用靜態分析的建議也是合理的建議。 – Zack 2010-03-30 13:55:48

1

根據我的經驗,10個令人討厭的事情中有9次,很難追查任何事情的非調試與調試版本中的崩潰,iPhone或其他,都是由內存管理錯誤引起的。我會爲您的問題投入資金,這是由於發佈或保留信息不當或缺少信息而造成的。如果您還沒有嘗試過,請在您的調試版本配置中打開靜態分析器(我的XCode現在正在更新,但我相信如果您在構建屬性中搜索「分析器」或「鏗鏘聲」,應該找到合適的設置),看它是否指向任何可以說明的事情。如果沒有,您可以使用儀器來幫助您檢查問題,並嘗試隔離調試器中的問題區域。

它可以幫助您通過修改您的調試配置或複製它來使用一組不同的編譯器標誌,以更緊密地與發佈版本中發生的情況對齊,從而在非實際發佈版本中重現問題(我不記得有什麼不同之處,但我會假設在你的編譯器標誌中添加一個「-O2」會讓你獲得最大的效果)。