ObjC ARC收缩(铿锵崩溃)

时间:2012-11-16 03:58:55

标签: objective-c ios xcode automatic-ref-counting clang

我总是犹豫在这里向杀手论坛添加一个全新的问题,但我还没有看到任何接近这个bug的内容。

在编译我的一个.m文件时,似乎clang崩溃了。如果有人看到或知道下面的任何解决方案,我将非常感激。

使用 XCode 4.4.1

版本配置中构建 armv6 时会发生此错误

但是,当我在调试配置中构建 armv6 时,不会发生,或者为armv7,armv7s或i386构建版本。

具体错误是“ObjC ARC收缩”:

    1. <eof> parser at end of file
    2. Code generation
    3. Running pass 'Function Pass Manager' on module '/Users/Me/Documents/ThisProject/iOS/..../ClassFoo.m'.
    4. Running pass 'ObjC ARC contraction' on function '@"\01-[ClassFoo evalJS:]"'
    clang: error: unable to execute command: Segmentation fault: 11
    clang: error: clang frontend command failed due to signal (use -v to see invocation)
    clang: note: diagnostic msg: Please submit a bug report to http://developer.apple.com/bugreporter/ and include command line arguments and all diagnostic information.

在../Intermediaries/Project.build/armv6/文件夹中,我看到:

    ClassFoo.dia

我应该看到(就像所有周围的文件一样)

    ClassFoo.d
    ClassFoo.dia
    ClassFoo.o

以下是clang堆栈的前4位,以防有人认出其中的内容:

    0  clang             0x00000001010536f2 main + 17107682
    1  clang             0x0000000101053b79 main + 17108841
    2  libsystem_c.dylib 0x00007fff93c428ea _sigtramp + 26
    3  libsystem_c.dylib 0x00007fff93c7a54e tiny_malloc_from_free_list + 1078

编辑:我还注意到最近再次尝试我对-fno-objc-arc标志的抱怨 - 也许编译器sym-links指向错误的二进制文件? / p>

提前致谢,

4 个答案:

答案 0 :(得分:4)

感谢您的所有兴趣,我很遗憾不得不自己回答这个问题,但我尝试过的任何其他解决方案都没有取得任何成功。我已经尽力将我的冒险记录在这里作为指导,希望能帮助其他几个人。

简短版本:

  1. Xcode 4.5+不支持构建armv6(iphone 3g)。
  2. 全新安装4.5&amp; 4.4.1我经历过各种版本 原始错误。
  3. 原因有两方面:

    • xcspec文件Xcode使用不包含此体系结构的条目。
    • 4需要libclang_rt * .a文件剥离了armv6切片。
  4. 有一个解决方案! (请参阅下面的长版)

  5. 长版:

    在我解决这个问题的许多令人沮丧的尝试中,例如搜索SO论坛,搜索苹果开发论坛,谷歌搜索,无休止地摆弄项目设置,将早期的SDK复制到Xcode.app包中,发布此问题,向苹果等提交错误报告,无限期&lt; - 意味着,“因此进入无限”,每个人似乎都没有任何相关内容可以透露或只有一小部分信息。

    这个解决方案的配方终于让一个沮丧而坚定的开发人员在一个漫长的夜晚成为一切的高潮。

    那么操作方法在哪里?

    (就在这里,兄弟)

    大约有12个步骤,所以不要忘记图像下方的最后一步!

    免责声明:这是我自己的解决方案,它对我很有用,但如果您不确定发生了什么或正在做什么,请务必小心并意识到我将不承担任何责任试图遵循这些步骤可能导致的任何损害。那就是说,你走吧!

    1. 如果您还没有副本,请从http://connect.apple.com
    2. 下载Xcode 4.4.1
    3. 提取/PATH_TO_YOUR_Xcode_4.4.1.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk
    4. 将其复制到/PATH_TO_YOUR_Xcode_4.5.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/
    5. 现在您将在Xcode 4.5中编辑4个Xcode .xcspec文件:

      • 在此处导航:/PATH_TO_YOUR_Xcode_4.5.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Specifications
      • 选择以下文件:

        • iPhoneXcode4Options.xcspec
        • iPhoneOSArchitectures.xcspec
        • iPhoneCompilerOptions.xcspec
        • iPhoneClangOptions.xcspec
      • 右键单击并选择“使用Xcode打开”

    6. 重复Xcode 4.4.1,然后将两个窗口并排放在一起(只是让这更容易)。
    7. 您要将armv6添加到多个条目中,如下所示: iPhoneClangOptions.xcspec

    8. 再次: iPhoneCompilerOptions.xcspec

    9. 在这里: iPhoneXcode4Options.xcspec

    10. 在这里你切割&amp;将Xcode 4.4.1中的条目粘贴到Xcode 4.5: iPhoneOSArchitectures.xcspec

    11. 好吧,你完成了那种乏味,耶!保存已编辑的文件并将其全部关闭。接下来,您必须创建新的libclang_rt*.a文件来处理这些拱门的编译。在Terminal中更容易完成此步骤。输入以下命令:

    12. 确保备份复制,路径或输入中没有错误!

       cd /PATH_TO_YOUR_Xcode_4.4.1.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/4.2/lib/darwin
      
       sudo mkdir armv6_extractions
      
       lipo -extract armv6 -output armv6_extractions/libclang_rt.ios.armv6.a libclang_rt.ios.a
       lipo -extract armv6 -output armv6_extractions/libclang_rt.profile_ios.armv6.a libclang_rt.profile_ios.a
       lipo -extract armv6 -output armv6_extractions/libclang_rt.cc_kext.armv6.a libclang_rt.cc_kext.a
      
       sudo cp -R armv6_extractions  /PATH_TO_YOUR_Xcode_4.5.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/4.2/lib/darwin
      
       cd /PATH_TO_YOUR_Xcode_4.5.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/4.2/lib/darwin
      
       sudo mkdir originals
       sudo cp libclang_rt.ios.a originals/
       sudo cp libclang_rt.cc_kext_ios5.a originals/
       sudo cp libclang_rt.profile_ios.a originals/
      
       lipo -create -output libclang_rt.ios.a armv6_extractions/libclang_rt.ios.armv6.a originals/libclang_rt.ios.a
       lipo -create -output libclang_rt.cc_kext_ios5.a armv6_extractions/libclang_rt.cc_kext.armv6.a originals/libclang_rt.cc_kext_ios5.a
       lipo -create -output libclang_rt.profile_ios.a armv6_extractions/libclang_rt.cc_kext.armv6.a originals/libclang_rt.profile_ios.a
      
      1. 重启Xcode 4.5

        ^ ...我在这里写了“11”......为什么它显示为“1”?

      2. 打开项目并相应地编辑您的设置。我建议您创建一个单独的配置,仅用于构建armv6,并在完成后将所有内容组合在一起。

        • armv6添加到Valid Architectures
        • armv6添加到Architectures
        • 对于您的特定armv6配置,请将Base SDK设置为iOS 5.x(现在下拉菜单中列出的任何内容)
        • 根据需要设置您的部署目标(到目前为止,我已经构建了低至iOS4.1,我相信您在开始时安装的iOS5.x sdk可以部署低至4.x)
      3. 好的,我认为就是这样。

        如果有人看到需要进行的任何编辑,请不要这样做,我欢迎任何人必须在此提供任何反馈。

        如果出现问题,手指交叉您可以随时重新安装Xcode并重试(或不重复)。

        祝你好运。

答案 1 :(得分:1)

之前我遇到过这个问题....你不止一次初始化你的.m吗?还是进口呢?这个问题发生在我身上的唯一一次是当我尝试初始化或导入.m文件以外的地方而不是其原生环境。

答案 2 :(得分:1)

编译器不应该崩溃。如果确实如此,则供应商需要修复它。不幸的是,我不认为你能通过Apple的Radar获得任何有用的响应,因为他们已经继续前进:Xcode 4.5中有一个更新版本的Clang,他们不再支持armv6了。

说过您应该打开技术支持事件,因为他们可能会为您提供解决方法。

答案 3 :(得分:0)

错误消息表示处理函数@“\ 01- [ClassFoo evalJS:]”时编译器内部错误。您可以通过重新排列该函数中的代码和/或将volatile添加到该函数中的局部变量来解决错误。