2014-03-26 28 views
2

我一直在處理我的iPhone應用程序中的一個有害的崩潰錯誤,該錯誤在從App Store下載的版本中始終可重現,但根本不在調試版本中。我已經制作了一個解決方法,它通過排除UIViewController動畫期間運行的關鍵繪圖代碼而起作用。不可重現的崩潰Bug涉及CGPathAddLineToPoint

  • 崩潰日誌表明CGPathAddLineToPoint中存在斷言失敗。
  • 該應用程序使用繪圖函數CGContextMoveToPoint,CGContextAddLineToPoint和CGContextStrokePath。函數CGPathCreateMutable,CGPathAddLines和CGContextAddPath也被使用,但即使在(應該)避免調用它們的配置中,該應用仍然崩潰。
  • 當呈現UIViewController(動畫)時在視圖上繪製線條時發生崩潰。否則,繪圖工作沒有問題。
  • 我已經在調試版本中確認每一行繪製的每一點都是真實的,並在視圖的邊界內。
  • 嘗試繪圖時,應用程序立即在iOS7上崩潰。在iOS5和iOS6上,應用程序在崩潰前停止響應30秒,留下未知信息的「未知」崩潰日誌。
  • 我在網上發現的類似於這個問題的唯一情況是CGFloatIsValid在OS X應用程序(包括髮布到Apple支持論壇的iPhoto崩潰日誌)中的CGPathAddLineToPoint中斷言失敗。

我不能說更多關於它,因爲應用程序從不崩潰,甚至在調試版本中發出警告。有沒有其他人遇到過這個錯誤?有沒有更好的方法來解決這個問題?

您可以在發佈版本on the App Store中查看實際解決方法。當計算器處於2D模式時,您可以看到圖形上的線條延遲到動畫完成後,當您按下[Graph]按鈕時。

崩潰日誌(運行iOS 7.0.3,應用的ARMv7從iPhone 5S)的重要組成部分:

Exception Type: EXC_CRASH (SIGABRT) 
Exception Codes: 0x0000000000000000, 0x0000000000000000 
Triggered by Thread: 0 

Thread 0 Crashed: 
0 libsystem_kernel.dylib   0x3a5e11fc __pthread_kill + 8 
1 libsystem_pthread.dylib   0x3a648a4f pthread_kill + 55 
2 libsystem_c.dylib    0x3a592029 abort + 73 
3 libsystem_c.dylib    0x3a571c67 __assert_rtn + 179 
4 CoreGraphics     0x2fd566f5 CGPathAddLineToPoint + 149 
5 (My App)      0x001464cd 0xd7000 + 455885 
6 UIKit       0x324d4dd5 -[UIView(CALayerDelegate) drawLayer:inContext:] + 369 
7 QuartzCore      0x3210aa75 -[CALayer drawInContext:] + 97 
8 QuartzCore      0x320f4241 CABackingStoreUpdate_ + 1857 
9 QuartzCore      0x321ce2e9 ___ZN2CA5Layer8display_Ev_block_invoke + 49 
10 QuartzCore      0x320f3af1 x_blame_allocations + 81 
11 QuartzCore      0x320f37a3 CA::Layer::display_() + 1115 
12 QuartzCore      0x320d7365 CA::Layer::display_if_needed(CA::Transaction*) + 205 
13 QuartzCore      0x320d6ffd CA::Layer::layout_and_display_if_needed(CA::Transaction*) + 21 
14 QuartzCore      0x320d6a09 CA::Context::commit_transaction(CA::Transaction*) + 225 
15 QuartzCore      0x320d681b CA::Transaction::commit() + 311 
16 QuartzCore      0x320d0549 CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*) + 53 
17 CoreFoundation     0x2fc9bf67 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 19 
18 CoreFoundation     0x2fc998f3 __CFRunLoopDoObservers + 283 
19 CoreFoundation     0x2fc99c3f __CFRunLoopRun + 735 
20 CoreFoundation     0x2fc0446d CFRunLoopRunSpecific + 521 
21 CoreFoundation     0x2fc0424f CFRunLoopRunInMode + 103 
22 GraphicsServices    0x349382e7 GSEventRunModal + 135 
23 UIKit       0x324b9841 UIApplicationMain + 1133 
24 (My App)      0x000de723 0xd7000 + 30499 
25 (My App)      0x000dde0c 0xd7000 + 28172 
+0

它在斷言中崩潰。什麼是斷言信息?它應該在程序的標準錯誤中。 –

+0

在崩潰日誌中沒有關於斷言失敗的描述。是否有其他地方的信息會被記錄下來? –

+0

升級到Xcode 5.1後,我有類似的問題,iOS PhoneGap + jQuery Mobile應用程序。1:http://stackoverflow.com/questions/23413205/updated-to-xcode-5-1-1-causes-strange-crash-of-ios-app –

回答

1

幾件事情:

嘗試在機器上打開崩潰日誌從您在應用商店中提交了該版本。該版本應該有包含符號文件的檔案,您需要用符號表示故障日誌。

如果在視圖控制器正在屏幕上動畫時將線條添加到路徑中,您只會崩潰,爲什麼不將代碼添加到presentViewController:animated:completion:調用啓用繪圖的方法的調用完成塊中。設置視圖控制器,以便在第一次顯示時禁用圖形,並通過完成塊中的方法調用啓用。

+0

我在項目已存在的唯一一臺機器(以及我提交存檔的機器)上打開了崩潰日誌。當我要求Xcode來表示它時,我所得到的只是那些十六進制字符,並且沒有關於在我自己的代碼中發生崩潰的更多信息。 –

0

爲了闡明(對於未來的人),如果您的應用在動畫期間崩潰(僅在App Store版本中),並且崩潰日誌指示CGPathAddLineToPoint中斷言失敗,則有一種解決方法。只需在動畫期間排除所有繪製代碼​​,並且不會崩潰。