3

我的iPhone應用程序最近被拒絕從App Store「因爲它發射崩潰」。但是,我無法再現這次崩潰。該應用程序可以在模擬器和具有Apple測試它的相同硬件和軟件的設備上完美工作(iPhone 3.1運行iOS 4)。他們發給我的崩潰日誌說「沒有可用的Backtrace」,所以我無處看到我的代碼。這裏有一個例子:iPhone與「沒有跟蹤」崩潰

Incident Identifier: [...] 
CrashReporter Key: [...] 
Hardware Model:  iPhone3,1 
Process:   [MyApp] [1172] 
Path:   /var/mobile/Applications/[...]-3F1B-4504-A572-[...]/[MyApp].app/[MyApp] 
Identifier:  [MyApp] 
Version:   ??? (???) 
Code Type:  ARM (Native) 
Parent Process: launchd [1] 

Date/Time:  2010-07-08 [...] 
OS Version:  iPhone OS 4.0 (8A293) 
Report Version: 104 

Exception Type: EXC_BAD_ACCESS (SIGSEGV) 
Exception Codes: KERN_INVALID_ADDRESS at 0xfe42c648 
Highlighted Thread: 0 

Backtrace not available 

Unknown thread crashed with ARM Thread State: 
    r0: 0x00002388 r1: 0x00000000  r2: 0x3e2b47c8  r3: 0x00000108 
    r4: 0x2fe00000 r5: 0x00000000  r6: 0x00000000  r7: 0x00000000 
    r8: 0x2ffffb48 r9: 0x2fffecfc  r10: 0x00000000  r11: 0x00000000 
    ip: 0x00000010 sp: 0x2ffffb4c  lr: 0x2fe08907  pc: 0xfe42c648 
    cpsr: 0x40000010 

Binary Images: 
    0x1000 - 0x78fff +[MyApp] armv7 <23af3d265c3086eaceb51cc649eb794f> /var/mobile/Applications/[...]-3F1B-4504-A572-[...]/[MyApp].app/[MyApp] 
0x2fe00000 - 0x2fe26fff dyld armv7 <697ae459733a7f0b6c439b21ba62b110> /usr/lib/dyld 
[many more libraries...] 

我該如何開始調試呢?這可能是一個構建問題而不是編碼錯誤嗎?我可以從崩潰報告的「ARM線程狀態」或「二進制映像」部分中提取任何有用的信息嗎?

謝謝!

*更新:*我已經在另一臺運行iOS 4的iPhone上首次安裝了應用程序,但仍無法重現崩潰。我開始認爲這是構建時參數(如庫或目標版本)的問題。根據崩潰報告,是否有可能我的應用程序的代碼被執行了?

回答

0

我從來沒有能夠重現崩潰。我混淆了一些構建參數並重新提交,並獲得批准。

0

段錯誤不太可能是構建錯誤。要重現此問題,請在運行該項目之前清除iPhone模擬器上保存的任何信息;你可能假設你自己的iPhone上存在NSUserDefaults中的某些條目,但是這些條目在缺省安裝中不可用。如果不能重現問題,那麼您應該爲每個組件創建單元測試,一次排除每個組件,將其作爲失敗的原因。最終,除了導致失敗的真正原因之外,你將排除導致失敗的各種原因。

+0

好主意;我嘗試重置模擬器,但沒有運氣。而在啓動時運行的代碼很簡單,但我會三重檢查它。 – tba 2010-07-11 07:36:07

+2

測試需要在設備上完成。不能在模擬器中重現崩潰沒有意義。 – Rab 2010-07-11 18:51:19

1

請參閱Technical Note TN2151:Understanding and Analyzing iPhone OS Application Crash Reports.符號通常會幫助您追蹤崩潰的來源,但由於沒有回溯,因此在此情況下可能無效。

不要在模擬器上打擾測試。模擬器構建和設備構建完全分開編譯兩個不同的硬件。僅僅因爲它在模擬器上運行就告訴你任何關於設備故障的信息。

請記住,蘋果公司將通過採取其他應用程序佔用大部分內存的方式在iOS4上啓動應用程序來壓力測試應用程序。您也需要在測試設備上執行此操作。

您很可能不得不將您的測試設備擦回默認設置以複製Apple所做的測試。然後打開每個可能的應用程序,然後啓動您自己的應用

1

您可以從ARM線程狀態中獲取一些信息。 PC寄存器是唯一包含崩潰報告抱怨的無效地址的寄存器。這意味着你的應用程序試圖在該地址執行代碼。

SIGSEGV表示有問題的地址是無效的。系統沒有設置這個地址的內存頁面。

我不認爲iOS會允許你簡單地從任何地址執行代碼,但是當函數返回時堆棧幀可能被破壞並且返回地址無效。這支持「回溯不可用」問題。

污染堆棧可能是緩衝區溢出的結果。如果在本地變量數組上使用memcpy或set循環並超出數組的末尾,則可以銷燬該堆棧。