堆栈崩溃内部方法,有时只发生(竞争条件?),只在模拟器中发生

时间:2011-04-18 21:51:53

标签: iphone cocoa-touch xcode

我一直在努力追查这次崩溃的原因,它经常发生,但只在模拟器中(不在设备上),然后只是部分时间。

Stack Trace是: Stack Trace

我在打电话:

UITextView *myTextView = [[UITextView alloc] initWithFrame:CGRectMake(0,0,100,100)];

在大多数情况下,这里没有问题。真正令人沮丧的部分是它没有问我正在调用的问题,而是WebFrame内部的一些问题(我假设它是UITextView的内部部分

崩溃日志:

2011-04-18 14:34:48.729 MyApp[73336:40b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[WebFrame _isIncludedInWebKitStatistics]: unrecognized selector sent to instance 0xa901a50'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x03003be9 __exceptionPreprocess + 185
    1   libobjc.A.dylib                     0x031585c2 objc_exception_throw + 47
    2   CoreFoundation                      0x030056fb -[NSObject(NSObject) doesNotRecognizeSelector:] + 187
    3   CoreFoundation                      0x02f75366 ___forwarding___ + 966
    4   CoreFoundation                      0x02f74f22 _CF_forwarding_prep_0 + 50
    5   WebKit                              0x03abc862 -[WebFrameView(WebInternal) _setWebFrame:] + 98
    6   WebKit                              0x03abc75f -[WebFrame(WebInternal) _initWithWebFrameView:webView:] + 239
    7   WebKit                              0x03af6565 +[WebFrame(WebInternal) _createMainFrameWithSimpleHTMLDocumentWithPage:frameView:withStyle:editable:] + 85
    8   WebKit                              0x03b30ad0 -[WebView(WebPrivate) initSimpleHTMLDocumentWithStyle:editable:withFrame:withPreferences:] + 1184
    9   UIKit                               0x019be211 -[UIWebDocumentView initSimpleHTMLDocumentWithStyle:editable:withFrame:withPreferences:] + 255
    10  UIKit                               0x019321e8 -[UITextView commonInitWithWebDocumentView:isDecoding:] + 443
    11  UIKit                               0x0192f5ce -[UITextView initWithFrame:] + 118

并且它并不总是在那里崩溃,有时它通过该调用没有问题,然后在这里崩溃:

Second Stack

在日志中有以下借口:

Program received signal:  “EXC_BAD_ACCESS”.

同样,在这种情况下,初始调用(呈现模态视图控制器)是针对具有有效参数的有效目标,但这次崩溃似乎是报告misaligned_stack_error_是罪魁祸首。

这两个问题大约在同一时间开始,只在模拟器中出现,只有大约50%的时间(一个,另一个,或两者都没有,似乎几乎是随机的)。

希望其他人看到这一点,并且可以指出我正确的方向!

6 个答案:

答案 0 :(得分:2)

问题是一个非常艰难的问题,但看起来有人破解了问题,我们使用OS_vsnprintf(POSIX vsnprintf的包装器)来记录功能,并将日志输出到缓冲区而不检查是否超过了这些日志条目的长度缓冲区大小(使用\ 0终止)。这导致缓冲区溢出,这会使其他方法中毒,导致它们在被调用时崩溃。

它只出现在调试中,因为导致缓冲区溢出的真正长的日志条目仅出现在调试中。 (棘手!)

因此,如果您遇到类似问题,可能需要检查字符串处理和C功能,以确保不会意外导致缓冲区溢出!

答案 1 :(得分:0)

有趣而奇怪的人!

解决对齐问题和未知的iOS SDK私有方法......

仅在模拟器上,而不是设备......具有适用于所有地方的真正基本标准代码......

除非你错过了一些你没有包含在你的问题中的东西,比如一个非常奇怪的代码,我的两分钱猜测是一个带有脏库链接的脏开发环境......

尝试清理/重新安装Xcode?


编辑:因为它看起来不像:

  • 环境问题(在任何计算机上都失败)
  • 一个代码问题:再一次,你粘贴的代码非常基本,确保你没有错过任何东西!确保在那里粘贴更多代码。

我想到了另一个想法。我知道,from experience,LLVM2受到严重破坏,特别是关于库链接。

如果您使用的是LLVM2,可以试试GCC4.2 ......?

答案 2 :(得分:0)

我最近也遇到了一个奇怪的崩溃问题。您最近是否在项目中添加了任何框架或编译器参数?如果是这样,请尝试暂时清除它们,看看是否能解决问题。就我而言,正是UrbanAirship框架造成了麻烦。

答案 3 :(得分:0)

由于它在一个环境中失败并且在另一个环境中“起作用”,因此您可能找到了编译器错误(不太可能)或者它与内存相关(更有可能)。在这种情况下,设备上仍然存在错误,你还没有触发它(还)。

尝试运行Instruments,搜索内存泄漏,僵尸。检查所有dealloc调用,确保将属性归零,并调用[super dealloc]。一个很好的提示是,当你释放一个对象时,也没有指向它的指针,所以没有悬空引用。

如果Instruments没有帮助,请尝试确定重现问题所需的确切步骤,以便了解要在搜索中包含哪些区域以及哪些区域无关紧要。开始注释掉代码以排除它。最终你会缩小你的搜索范围并找到罪魁祸首。

答案 4 :(得分:0)

由于您在主题中提出了竞争条件的可能性,我认为您的应用程序是多线程的。确保您只是从主线程访问UIKit对象,按照Cocoa Fundamentals Guide中的多线程可可程序部分的指示:

  

应该使用所有UIKit对象   仅限主线程。

UIKit Framework Reference

  

在大多数情况下,UIKit课程   应该只用于   应用程序的主要线程。这是   对于派生的类尤其如此   来自UIResponder或涉及   操纵应用程序的用户   以任何方式接口。

答案 5 :(得分:0)

由于它只发生在模拟器(i386)版本中,而第二个堆栈跟踪的顶行是misaligned_stack_error_,您可以尝试以下操作:

-mstackrealign添加到主项目中的OTHER_CFLAGS。

假设这样可以解决模拟器问题,并且由于此标志而遇到设备问题,您可以执行以下操作:

•定义两个新的自定义构建设置:

OTHER_CFLAGS_iphoneos = $(OTHER_CFLAGS)
OTHER_CFLAGS_iphonesimulator = -mstackrealign $(OTHER_CFLAGS)

•将Other C Flags构建设置设置为:

$(OTHER_CFLAGS_$(PLATFORM_NAME))