2013-03-22 55 views
3

我在Xcode中製作的iOS遊戲中出現EXC_BAD_ACCESS異常。它發生在模擬器和真實設備上。它始終處於遊戲中的同一部分,但並不總是如此。這很神祕,因爲它似乎與遊戲的對象沒有任何關係,只是使用默認的庫/系統方法。 Xcode也不顯示哪一行代碼導致它(但它顯示程序集中的哪一行)。我在下面發佈回溯。什麼可能導致它?我怎樣才能找出問題所在?系統庫中iOS上的EXC_BAD_ACCESS

thread #1: tid = 0x1c03, 0x01980051 libobjc.A.dylib`_cache_getImp + 9, stop reason = EXC_BAD_ACCESS (code=1, address=0xc0000008) 
frame #0: 0x01980051 libobjc.A.dylib`_cache_getImp + 9 
frame #1: 0x0196dac4 libobjc.A.dylib`lookUpMethod + 42 
frame #2: 0x0196da88 libobjc.A.dylib`class_respondsToSelector + 65 
frame #3: 0x023160d3 CoreFoundation`objectIsKindOfClass + 51 
frame #4: 0x0239f087 CoreFoundation`__handleUncaughtException + 71 
frame #5: 0x0196f0b9 libobjc.A.dylib`_objc_terminate() + 86 
frame #6: 0x01da2a65 libc++abi.dylib`safe_handler_caller(void (*)()) + 13 
frame #7: 0x01da2acd libc++abi.dylib`std::terminate() + 23 
frame #8: 0x01da3c4e libc++abi.dylib`__cxa_rethrow + 83 
frame #9: 0x0196efbd libobjc.A.dylib`objc_exception_rethrow + 47 
frame #10: 0x022bbf98 CoreFoundation`CFRunLoopRunSpecific + 360 
frame #11: 0x022bbe1b CoreFoundation`CFRunLoopRunInMode + 123 
frame #12: 0x01df57e3 GraphicsServices`GSEventRunModal + 88 
frame #13: 0x01df5668 GraphicsServices`GSEventRun + 104 
frame #14: 0x00aa5ffc UIKit`UIApplicationMain + 1211 
frame #15: 0x000026e1 Game`main(argc=1, argv=0xbffff3bc) + 95 at main.m:6 
frame #16: 0x00002645 Game`start + 53 

回答

3

這是一個未捕獲的異常。應該有一條日誌消息來描述拋出的異常。


的E w ....醜......這是一個畸形的異常導致崩潰。

很可能,您的應用程序以某種方式破壞了內存。創建一個異常斷點(它在調試器UI中),並查看是否可以在調試器中斷開它。由於它是在回溯中重新拋出(),所以原始拋出可能實際上是有用的。

+0

你的意思是它應該出現在與NSLogs相同的控制檯上?除了我自己的日誌以外,沒有什麼東西。 – HLorenzi 2013-03-22 16:48:07

+0

異常斷點:+100!不敢相信我不知道這件事。謝謝! – ajh158 2013-06-19 13:27:31

0

我也看到一個EXC_BAD_ACCESS,這個堆棧跟蹤是在DisplayLink的處理程序中引發一個NSException的結果。在Xcode 4.6.2 OpenGL的遊戲應用程序模板的函數[:drawInRect的ViewController glkView] - :例如

#0 0x01142e52 in objc_exception_throw() 
#1 0x01d04deb in +[NSException raise:format:]() 
#2 0x00005502 in -[ViewController glkView:drawInRect:] at ViewController.m:225 
#3 0x010e8675 in -[GLKView _display:]() 
#4 0x010e8c89 in -[GLKView display]() 
#5 0x010e9ab7 in -[GLKViewController _updateAndDraw]() 
#6 0x01156663 in -[NSObject performSelector:]() 
#7 0x010e900f in -[GLKDisplayLinkMessenger message]() 
#8 0x0231f2d2 in CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)() 
#9 0x0231f75f in CA::Display::TimerDisplayLink::callback(__CFRunLoopTimer*, void*)() 
#10 0x01cc4376 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__() 
#11 0x01cc3e06 in __CFRunLoopDoTimer() 
#12 0x01caba82 in __CFRunLoopRun() 
#13 0x01caaf44 in CFRunLoopRunSpecific() 
#14 0x01caae1b in CFRunLoopRunInMode() 
#15 0x01c5f7e3 in GSEventRunModal() 
#16 0x01c5f668 in GSEventRun() 
#17 0x0001a65c in UIApplicationMain() 

該REPRO通過在引發異常產生。

有趣的是,它在運行iOS 6.0+的設備和模擬器上都有repros,但在iOS 5.1上沒有。

在iOS 6.0+中,似乎在DisplayLink :: Dispatch中添加了自動釋放池,並且在未處理的異常處理程序獲得機會之前似乎分配了NSException:

#0  0x01d07470 in -[NSException dealloc]() 
#1  0x011569ff in -[NSObject release]() 
#2  0x011550d5 in objc_release() 
#3  0x01155bd9 in (anonymous namespace)::AutoreleasePoolPage::pop(void*)() 
#4  0x01ca7468 in _CFAutoreleasePoolPop() 
#5  0x0230ffc1 in CA::AutoreleasePool::~AutoreleasePool()() 
#6  0x0231f3d2 in CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long)() 
#7  0x0231f75f in CA::Display::TimerDisplayLink::callback(__CFRunLoopTimer*, void*)() 
#8  0x01cc4376 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__() 
#9  0x01cc3e06 in __CFRunLoopDoTimer() 
#10  0x01caba82 in __CFRunLoopRun() 
#11  0x01caaf44 in CFRunLoopRunSpecific() 
#12  0x01caae1b in CFRunLoopRunInMode() 
#13  0x01c5f7e3 in GSEventRunModal() 
#14  0x01c5f668 in GSEventRun() 
#15  0x0001a65c in UIApplicationMain() 
#16  0x00002c3d in main 

這個自動釋放池似乎已經放在了iOS 6.0中。

可能的解決方法:捕捉所有NSExceptions在CADisplayLink目標函數,然後手動留住他們,並重新拋出,或調用您的未處理的異常處理,然後中止。