SIGSEGV SEGV_ACCERR崩溃报告 – 该怎么办?

我刚刚在AppStore上发布了一个Crittercism崩溃报告的应用程序,并且我收到了一些关于SIGSEGV错误的崩溃报告。 Crittercism给了我一个StackTrace和一些关于使用统计信息的方便的细节,等等。但是,我还是被这些符号化的堆栈跟踪弄糊涂了。 我对这种事情总体上有几个问题 –

  1. 堆栈跟踪中的许多类和方法甚至在我的应用程序中都没有使用(据我所知),这导致我相信这些崩溃是由苹果公司的私有API引起的。 看看这个问题底部附近的Stack Trace。 如果崩溃报告中的所有方法和类都不是直接在我的代码中实现,我怎么能告诉崩溃我的应用程序?

  2. 在坠毁的线程中每行结尾处的数字+号代表什么?

  3. 大多数Q / A的StackOverflow询问有关SIGSEGV崩溃说,他们是由内存泄漏或问题引起的, 但是 ,如果我在我的iOS项目中使用ARC,我怎么能因为内存问题崩溃? ARC是不是应该为我pipe理所有这些东西?

  4. 如果我不能复制错误/崩溃,我该怎么办?

  5. 有什么方法可以真正阅读 StackTrace吗? 有什么总的来说会有助于理解发生的事情吗?

这里是来自Crittercism主线程崩溃报告的StackTrace,这个问题涉及到:

 Thread: Unknown Name (Crashed) 0 UIKit 0x37307a22 -[UIView(CALayerDelegate) actionForLayer:forKey:] + 138 1 QuartzCore 0x38fdfff7 -[CALayer actionForKey:] + 75 2 QuartzCore 0x38fdffa7 _ZL12actionForKeyP7CALayerPN2CA11TransactionEP8NSString + 59 3 QuartzCore 0x38fdfe93 _ZN2CA5Layer12begin_changeEPNS_11TransactionEjRP11objc_object + 131 4 QuartzCore 0x38fdab87 _ZN2CA5Layer6setterEj12_CAValueTypePKv + 183 5 QuartzCore 0x39007057 -[CALayer setBackgroundColor:] + 35 6 UIKit 0x3731ef51 -[UIView(Internal) _setBackgroundCGColor:withSystemColorName:] + 1021 7 APP NAME 0x000a301d 0x00086000 + 118813 8 libdispatch.dylib 0x3962511f _dispatch_call_block_and_release + 11 9 libdispatch.dylib 0x39628ecf _dispatch_queue_drain$VARIANT$mp + 143 10 libdispatch.dylib 0x39628dc1 _dispatch_queue_invoke$VARIANT$mp + 41 11 libdispatch.dylib 0x3962991d _dispatch_root_queue_drain + 185 12 libdispatch.dylib 0x39629ac1 _dispatch_worker_thread2 + 85 13 libsystem_c.dylib 0x3824da11 _pthread_wqthread + 361 

你需要象征这个崩溃报告。 7号是你将感兴趣的行,但没有符号信息,所以崩溃报告不能被翻译成对你有用的东西。 为了符号化,您需要在app store版本中使用的确切代码。 如果你有这个,那么你可以参考这个答案:

https://stackoverflow.com/a/13280585/1155387

至于其他的事情:

1)不要这么快就承担一个内部的API错误。 你的函数显然改变了一个视图的背景色,这个视图在内部调用了各种方法。 它可能以某种方式传递了一个无效的值。 不要太天真,认为你写的代码是有史以来唯一的代码。

2)+符号表示二进制对象内部代码的偏移量。 对你没有用处

3)ARC很容易产生内存错误,因为ARC只处理Objective-C的范围。 任何CoreFoundation对象等都不会被pipe理。 这不一定是这里发生的事情,但ARC并不意味着你必须一起停止考虑内存。

4)见上文

5)见上文

我会愿意做你做这样的事情:

 CALayer *layer = [CALayer layer]; layer.delegate = self; 

然后你的对象“自我”在CALayer的最后一次引用被删除之前被释放。 委托属性不包含您设置为layer.delegate值的对象的引用。 这与ARC无关(ARC不会在您的应用程序中奇迹般地修复所有指针的使用)。

所以,首先要做的就是查看你设置一个CALayer委托的代码,并确保当你的“self”对象被释放时,将这个委托ref设置回nil。 这将打破CALayer和你的对象的联系。 一般来说,你应该把你的dsym上传到Crittercism,但是在这种情况下它并不重要。