2012-12-10 80 views
17

我刚刚在AppStore上发布了Crittercism崩溃报告,我收到了一些与SIGSEGV错误有关的崩溃报告。 Crittercism为我提供了一个StackTrace和一些关于使用情况统计信息的方便的细节,但是,我仍然对这些符号化的堆栈跟踪感到困惑。我一般在这种东西的几个问题 -SIGSEGV SEGV_ACCERR崩溃报告 - 该怎么办?

  1. 许多类和在堆栈跟踪方法,甚至没有在我的应用程序使用(据我所知),这使我相信,这些崩溃是由于Apple的私人API导致的。看看这个问题底部附近的Stack Trace。 如果崩溃报告中的所有方法和类都没有直接在我的代码中实现,我该如何判断崩溃了我的应用程序?

  2. +标志与数字在每一行结束时坠毁的线架是什么呢?

  3. 最Q在计算器上/ A是询问SIGSEGV崩溃说,他们是由内存泄漏或问题造成的,但是我怎么能有因为内存问题崩溃,如果我使用ARC在我的iOS项目? ARC是不是应该为我管理所有这些东西?

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

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

这里是从Crittercism主线程崩溃报告的堆栈跟踪,这个问题涉及到:

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 

回答

6

您需要symbolicate这个崩溃报告。 7号线是您将感兴趣的线路,但没有符号信息,因此崩溃报告无法翻译成对您有用的内容。为了表示符号,您需要在应用商店版本中使用的确切代码。如果你有,那么你可以参考这样的回答:

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

至于其他的事情:

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

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

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

4)见上文

5)见上文

4

我愿意为你做了这样的事情:

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

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

因此,首先要做的就是看你设置一个的CALayer委托的代码,并确保当你的“自我”的对象被释放到背部设置此委托裁判为零。这将打破CALayer和你的对象的关联。一般来说你应该上传至DSYM Crittercism,但它不会多大关系在这种情况下。