SIGSEGV SEGV_ACCERR 崩溃报告 - 应该怎么做?

17

我刚刚在AppStore上发布了一款应用程序,其中包含Crittercism崩溃报告功能。我收到了很多关于SIGSEGV错误的崩溃报告。Crittercism为我提供了StackTrace和一些有用的使用统计数据等详细信息。然而,我仍然对这些符号化的堆栈跟踪感到困惑。总的来说,我有一些关于这种事情的问题-

  1. 在堆栈跟踪中的许多类和方法甚至未被我的应用程序使用(据我所知),这使我相信这些崩溃是由于来自苹果的私有API引起的。请查看此问题底部的堆栈跟踪。 如果崩溃报告中的所有方法和类都不是直接在我的代码中实现的,那么我该如何确定是什么导致了应用程序崩溃?

  2. 崩溃线程中每行末尾带有数字加号符代表什么意思?

  3. 大多数在StackOverflow上询问关于SIGSEGV崩溃的Q/A都表示它们是由内存泄漏或问题引起的,然而如果我在iOS项目中使用ARC,那么我怎么可能因为内存问题而崩溃呢?ARC不是应该为我管理所有这些吗?

  4. 如果我无法复制错误/崩溃应该怎么做?

  5. 是否有任何方法可以真正地读取堆栈跟踪?是否有任何一般的内容对于理解发生了什么有帮助?

这是与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
2个回答

6
您需要对这个崩溃报告进行符号化。您将会关注第7行,但是因为没有符号信息,该崩溃报告无法转化为有用的内容。为了符号化,您需要使用在应用商店发布中使用的确切代码。如果您有,请参考此答案:https://dev59.com/XmrXa4cB1Zd3GeqPAZOL#13280585
至于其他事情:
1)不要轻易认为是内部API的错误。您的函数显然会改变视图的背景颜色,并调用内部的各种方法。它可能以某种方式传递了无效的值。不要天真地认为您编写的代码是唯一执行的代码。
2)+号表示二进制对象内部该代码的偏移量。对您没有用处。
3)使用ARC很容易出现内存错误,因为ARC仅处理Objective-C范围内的内存管理。任何CoreFoundation对象等都将不受管理。这不一定是此处发生的情况,但ARC并不意味着您必须完全停止考虑内存。
4)见上文
5)见上文

4
我猜你做了类似这样的事情:
CALayer *layer = [CALayer layer];
layer.delegate = self;

在你最后引用CALayer之前,对象“self”已被释放。委托属性不保持对设置为layer.delegate值的对象的引用。这与ARC无关(ARC不能神奇地修复应用程序中的所有指针使用情况)。

因此,首先要做的是查看您设置CALayer委托的代码,并确保在释放“self”对象时将此委托引用设置回nil。这将打破CALayer和您的对象之间的关联。通常情况下,您应该将dsym上传到Crittercism,但在这种情况下没有什么影响。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接