Xcode:只会在 4 英寸 64 位设备上失败

Posted

技术标签:

【中文标题】Xcode:只会在 4 英寸 64 位设备上失败【英文标题】:Xcode: will only fail on 4 inch 64-bit device 【发布时间】:2014-03-16 02:41:19 【问题描述】:

我正在 Xcode 中构建一个 ios 应用程序。我的构建遇到了问题。具体来说,当我在我的物理设备(iPhone 5)和任何模拟的 32 位设备上运行我的应用程序时,它运行良好。但是如果我使用 4 英寸 64 位设备,我会在特定代码行得到以下错误:

Thread 1: EXC_BAD_ACCESS (code=EXC_I386_GPFLT)

我猜这个错误没有任何意义,因为我在任何其他设备上都没有。

我已尝试清理我的构建和构建文件夹,甚至恢复到没有此问题的早期提交。那没有用(令我惊讶的是)。

当我第一次遇到此错误时,我遇到了类似于 this *** question 的与图像相关的内容(“无法加载从带有标识符的包中的笔尖引用的“”图像...”)。具体来说,我认为我的问题是由于在 Interface Builder 中复制和粘贴 UIButton 造成的。我已经删除了这个按钮。

我该如何解决这个问题?

当我在导致此问题的唯一模拟设备上运行程序时,我在控制台上得到以下输出:

2014-03-16 16:35:54.922 iSparse[3743:60b] 
(lldb)
(lldb) p idx[0]
(int) $0 = 35353
(lldb) p idx[1]
(int) $1 = 17508
(lldb) p colorPlane[0]
(float) $2 = 218
(lldb) p y_r[0]
(float) $3 = 0
(lldb) p y_r[1]
(float) $4 = 0

这告诉我idxcolorPlane 似乎是有效的数组,并且由于y_r 未填充像素值,因此该行代码未执行。

出现这个错误的函数是

-(void)makeMeasurements2:(UIImage *)image atRate:(float)rate
                     red:(float *)y_r green:(float *)y_b blue:(float *)y_g
                ofLength:(int)length idx:(int *)idx
    // vDSP_vgathr is equivalent to a[i] = b[c[i]] (!)
    int pix = image.size.height * image.size.width;
    float * array = (float *)malloc(sizeof(float) * pix * 4);
    float * colorPlane = (float *)malloc(sizeof(float) * pix);
    // get data

    [self.dwt imageToRawArray:image into:array pix:length];
    int n;

    // perform wavelet, 2D on image
    // using color planes, all of that
    // vDSP_vgathr is the equivalent of a[i] = b[c[i]]
    for (n=0; n<3; n++) 
        // copy from "array", which is RGBA,RGBA,RGBA...
        // and get the colorplane out
        cblas_scopy(pix, array+n, 4, colorPlane, 1);

        // the do-what-you-want code should go here.
        if (n == 0) 
            vDSP_vgathr(colorPlane, (const vDSP_Length *)idx, 1, y_r, 1, (int)(rate*pix));
        
        if (n == 1) 
            vDSP_vgathr(colorPlane, (const vDSP_Length *)idx, 1, y_b, 1, (int)(rate*pix));
        
        if (n == 2) 
            vDSP_vgathr(colorPlane, (const vDSP_Length *)idx, 1, y_g, 1, (int)(rate*pix));
        
        cblas_scopy(pix, colorPlane, 1, array+n, 4);
    

    catlas_sset(pix, 255, array+3, 4);

    image = [self.dwt UIImageFromRawArray:array image:image forwardInverseOrNull:@"null"];
    free(array);
    free(colorPlane);

它在 for 循环中的第一个 vDSP_vgathr 上失败。

【问题讨论】:

设置异常断点并同时发布符号化日志和发生异常的代码。 EXC_BAD_ACCESS 通常是由访问已释放的对象引起的,因此使用 NSZombies 运行也可能有助于追踪错误。 请出示实际代码。 添加了调试器输出和失败的函数。 奇怪,EXC_I386_GPFLT 听起来不像是 Arm64 错误。还是在 64 位模拟器中? 尝试将所有 int 类型更改为 NSInterger 【参考方案1】:

您发布的代码确实与错误有关,而且它不是 Xcode 特定的。查看this answer(使用相同的函数调用!)了解更多详情。

【讨论】:

以上是关于Xcode:只会在 4 英寸 64 位设备上失败的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 5.1 在 64 位模拟器上构建 opencv 失败

多视图控制器 - iOS 7

错误 ITMS-90086 缺少 64 位支持 Xcode 6.4 和 Cordova 2.9.1

在最新的 Xcode (4.5) 中使用 iPad 1 进行开发和调试,如何?

JSONKit 崩溃:iPad 视网膜 64 位设备模拟器中的 iOS 7 Xcode 5.1

Xcode6 上 LaunchScreen 的版权标签