来自UIAlertView _performPopup的低级别iOS崩溃

时间:2010-11-30 00:30:47

标签: ios crash uialertview

我最近遇到了一些低级别的崩溃,特别是这个很难确定应用程序的来源/状态。有没有人看过这个或知道这个问题?谢谢!

异常类型:EXC_BAD_ACCESS(SIGSEGV) 异常代码:KERN_INVALID_ADDRESS位于0x3dcccccd 崩溃的线程:0

Exception Type: EXC_BAD_ACCESS (SIGSEGV) Exception Codes: KERN_INVALID_ADDRESS at 0x3dcccccd Crashed Thread: 0

Thread 0 Crashed: 0 libobjc.A.dylib 0x000025fa objc_msgSend + 18 1 UIKit 0x00162d1c -[UIAlertView(Private) _performPopup:] + 12 2 UIKit 0x001628de -[UIAlertView(Private) _repopup] + 10 3 UIKit 0x0016d196 -[UIAlertView(Private) _removeAlertWindowOrShowAnOldAlert] + 70 4 UIKit 0x00162afa -[UIAlertView(Private) _popoutAnimationDidStop:finished:] + 502 5 UIKit 0x00050ae4 -[UIViewAnimationState sendDelegateAnimationDidStop:finished:] + 184 6 UIKit 0x000509ee -[UIViewAnimationState animationDidStop:finished:] + 34 7 QuartzCore 0x0002ee8c run_animation_callbacks(double, void*) + 284 8 QuartzCore 0x0002ed2c CA::timer_callback(__CFRunLoopTimer*, void*) + 96 9 CoreFoundation 0x00022d1c CFRunLoopRunSpecific + 2092 10 CoreFoundation 0x000224da CFRunLoopRunInMode + 42 11 GraphicsServices 0x000030d4 GSEventRunModal + 108 12 GraphicsServices 0x00003180 GSEventRun + 56 13 UIKit 0x0000342a -[UIApplication _run] + 374 14 UIKit 0x00001954 UIApplicationMain + 636 15 iPadDrinkHub.1.0.7 0x00002f24 0x1000 + 7972 16 iPadDrinkHub.1.0.7 0x00002ed8 0x1000 + 7896

1 个答案:

答案 0 :(得分:4)

奇怪的崩溃有时是记忆腐败和/或管理不善的症状。我刚刚在我的一个应用程序中发现并修复了一个难以发现的错误。该应用程序在iOS 3.2上运行了6个月完美无缺,但在iOS 4.2上会立即崩溃。在applicationDidFinishLaunching期间将主视图添加到窗口时发生了崩溃。堆栈跟踪显示100%的iOS代码;那里没有任何一个函数(除了applicationDidFinishLaunching)。事实证明,我在代码中过度释放了一个UIImage,这个代码在视图加载时已被调用。 (我错误地在自动释放的UIImage上调用了释放)。

我没有看到你所看到的特定崩溃,但是你可以尝试一些可以解释的事情:

(1)使用NSZombieEnabled运行应用程序。这是您通过Xcode设置的环境变量,它通常会识别您可能引用已释放对象的位置(例如,我之前提到的过度释放示例)。其他详细信息如下:

http://www.cocoadev.com/index.pl?NSZombieEnabled

(2)您可以打开记录,记录发送到所有对象的所有消息。该日志写入tmp文件夹中的文本文件。如果您检查导致崩溃的日志文件,您可能会在崩溃之前了解正在发生的事情。这实际上是我用来解决我的bug的技术。您可以修改代码以启用/禁用日志记录:

instrumentObjcMessageSends(YES);
// Do stuff...
instrumentObjcMessageSends(NO);

或者,您可以直接从调试器调用该函数。例如,在崩溃之前设置断点,然后进入调试器控制台并执行以下操作:

(gdb) call (void)instrumentObjcMessageSends(YES)

其他详细信息如下:

http://www.dribin.org/dave/blog/archives/2006/04/22/tracing_objc/