2012-02-26 74 views
0

iPhone應用程序在設備上崩潰,但不在模擬器上。所以我試圖學習如何解釋崩潰日誌。我閱讀了大量的論壇帖子,稱象徵性的崩潰日誌顯示了一個回溯軌跡,它給出了導致崩潰的調用的方法和行號,但我沒有看到任何有用的東西。也許我沒有看符號化的崩潰日誌。下面是我所看到的開頭:有人請幫忙瞭解崩潰?

Incident Identifier: 432A8974-1661-409F-B5A6-970148550A46 
CrashReporter Key: db93147c0a70a5f4c60dc92f826e72d5a74477c8 
Hardware Model:  iPhone3,3 
Process:   Darken [57959] 
Path:   /var/mobile/Applications/CB27C10F-CD3B-4148-8321-2C251888B27B/Darken.app/Darken 
Identifier:  Darken 
Version:   ??? (???) 
Code Type:  ARM (Native) 
Parent Process: launchd [1] 

Date/Time:  2012-02-25 10:43:47.753 -0500 
OS Version:  iPhone OS 4.2.10 (8E600) 
Report Version: 104 

Exception Type: EXC_BAD_ACCESS (SIGBUS) 
Exception Codes: KERN_PROTECTION_FAILURE at 0x00000008 
Crashed Thread: 0 

Thread 0 Crashed: 
0 libobjc.A.dylib     0x32716464 objc_msgSend + 16 
1 UIKit       0x3245e6fe -[UIScrollView(UIScrollViewInternal) _scrollViewAnimationEnded] + 90 
2 CoreFoundation     0x32071bb8 -[NSObject(NSObject) performSelector:withObject:] + 16 
3 UIKit       0x3245e5b8 -[UIAnimator stopAnimation:] + 276 
4 UIKit       0x323efbf2 -[UIAnimator(Static) _advance:] + 214 
5 UIKit       0x323efb0e LCDHeartbeatCallback + 10 
6 GraphicsServices    0x35474362 HeartbeatVBLCallback + 86 
7 IOMobileFramebuffer    0x34739bf4 IOMobileFramebufferVsyncNotifyFunc + 68 
8 IOKit       0x348e5e64 IODispatchCalloutFromCFMessage + 192 
9 CoreFoundation     0x32070be0 __CFMachPortPerform + 204 
10 CoreFoundation     0x320686f8 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 20 
11 CoreFoundation     0x320686bc __CFRunLoopDoSource1 + 160 
12 CoreFoundation     0x3205af76 __CFRunLoopRun + 514 
13 CoreFoundation     0x3205ac80 CFRunLoopRunSpecific + 224 
14 CoreFoundation     0x3205ab88 CFRunLoopRunInMode + 52 
15 GraphicsServices    0x354724a4 GSEventRunModal + 108 
16 GraphicsServices    0x35472550 GSEventRun + 56 
17 UIKit       0x323c7d1a -[UIApplication _run] + 406 
18 UIKit       0x323c5884 UIApplicationMain + 664 
19 Darken       0x000029d6 0x1000 + 6614 
20 Darken       0x00002998 0x1000 + 6552 

... 0比其他線程這裏列出

是什麼這裏查不到我的代碼行有用導致崩潰?變暗是應用程序的名稱 - 我已經知道了。我唯一認識到的方法名稱是UIApplicationMain,但是當應用程序首次啓動時沒有發生崩潰 - 我在一分鐘左右運行它,並在崩潰前執行了幾十個函數。

+0

您是否查看過設備日誌(使用Xcode組織器)以查看是否有任何錯誤消息與該崩潰的時間一致? – bneely 2012-02-26 04:44:29

+0

通常情況下,EXC_BAD_ACCESS崩潰會導致內存管理不善。如果您可以發佈此方法或部分,我們將能夠更詳細地幫助您。您是否嘗試過在設備上調試以縮小面積? – Osiris 2012-02-26 05:17:34

回答

0

你可能想嘗試在你的項目中設置NSZombieEnabled爲YES,並讓它在調試時運行。它應該停止在導致你的崩潰的代碼行。你的錯誤看起來像是一個EXC_BAD_ACCESS,這通常意味着你試圖訪問一些釋放的內存。

+0

我相信殭屍只能在模擬器上工作,而不能在設備上工作。請讓我知道如果這是錯誤的。正如我在原始發佈中所說的那樣,崩潰只發生在設備上。 – RobertL 2012-02-26 06:03:37

+0

在這個網站上有一個關於如何做到這一點的視頻:markj.net/iphone-memory-debug-nszombie。這有點舊,但它應該可以幫助您找到導致您崩潰的對象。 – Jamie 2012-02-26 06:14:03

0
  1. ,你不會得到從崩潰轉儲(行號,除非你使用-g編譯您的應用程序,並在GDB運行,但我對此表示懷疑,因爲你似乎並不知道這是什麼意思可言)。

  2. 您正在查看符號化故障轉儲:您具有調用堆棧中函數的名稱。崩潰發生在最後調用的(最上面的)函數中,它是objc_msgSend。這意味着你沒有正確地平衡你的alloc/retain/copy方法和autorelease/release,並且messenger函數試圖訪問已經釋放/損壞/不存在的內存,因此崩潰(EXC_BAD_ACCESS類似於段錯誤,當你犯這樣的錯誤時會得到其中的一個)。

所以我的建議是,三重檢查你的代碼修改引用計數的方法調用。

+0

你是對的我沒有用-g編譯。我確實已經認爲我必須搞砸一些關於內存管理的東西。我一遍又一遍地看了一遍代碼,並清理了一些東西(主要是因爲它更具可讀性和可理解性),但我找不到任何錯誤。我希望崩潰轉儲會有所幫助,但我猜想它不會。 – RobertL 2012-02-26 06:06:48

+0

@bneely:是的,我看着日誌。它沒有顯示這次事故。 – RobertL 2012-02-26 18:29:05

+0

@Osiris:我不知道涉及什麼方法或部分。這就是我希望從崩潰報告中學到的東西。它發生在從一個場景轉換到另一個場景(一個cocos2d應用程序)。這可能是場景中的某些事情正在結束,但它有超過500行的代碼,我沒有將崩潰縮小到任何一部分。 – RobertL 2012-02-26 18:32:42