Xcode 5.0.1 中未报告分段错误

Posted

技术标签:

【中文标题】Xcode 5.0.1 中未报告分段错误【英文标题】:Segmentation fault not reported in Xcode 5.0.1 【发布时间】:2013-11-03 16:48:31 【问题描述】:

我一直在调试一个很难发现我的错误的代码。 我已经声明和数组像

char* Cdiff[320];

然而,当在 Xcode 5.0.1 中运行应用程序时,它会在代码的其他部分崩溃(根据我的说法)与该数组没有任何关系。

我正在使用的代码示例是

...
...
//patchSize = 4, blockSize = 10
uchar *Cdiff = new uchar[(patchSize*patchSize)*2 * blockSize];

// FOR EACH BLOCK OF PATCHES (there are 'blockSize' patches in one block)
for (uint iBlock = 0; iBlock < nBlocks; iBlock++)

    // FOR EACH PATCH IN THE BLOCK
    for(uint iPatch = iBlock*blockSize; iPatch < (iBlock*blockSize)+blockSize; iPatch++)
    
        // GET THE POSITION OF THE upper-left CORNER(row, col) AND
        // STORE THE COORDINATES OF THE PIXELS INSIDE THE CURRENT PATCH (only the current patch)
        uint iPatchV = (iPatch*patchStep)/camRef->getWidth();
        uint iPatchH = (iPatch*patchStep)%camRef->getWidth();
        for (uint pRow = iPatchV, pdRow = 0; pRow < iPatchV+patchSize; pRow++, pdRow++)
        
            for (uint pCol = iPatchH, pdCol = 0; pCol < iPatchH+patchSize; pCol++, pdCol++)
            
                patchPos.push_back(Pixel(pCol, pRow));
            
        

        // GET THE RIGHT AND DOWN NEIGHBORS TO COMPUTE THE DIFFERENCES
        uint offset = 0;
        for (Pixel p : patchPos)
        
            uint r = p.getY();
            uint c = p.getX();

            uchar pixelV = ((uchar*)camRef->getData())[r*imageW+c];

            uint cRightNeighbor = c+patchStep;
            uchar pixelVrightP = 0;

            if (cRightNeighbor < imageW)
            
                pixelVrightP = abs(pixelV - ((uchar*)camRef->getData())[r*imageW+cRightNeighbor]);
            

            uint rDownNeighbor = r+patchStep;
            uchar pixelVbelowP = 0;

            if (rDownNeighbor < imageH)
            
                pixelVbelowP = abs(pixelV - ((uchar*)camRef->getData())[rDownNeighbor*imageW+c]);
            

            //---This is the right way to compute the index.
            int checking = (iPatch%blockSize)*(patchSize*patchSize)*2 + offset;
            //---This lines should throw a seg_fault but they don't
            Cdiff[iPatch*(patchSize*patchSize)*2 + offset] = pixelVrightP;
            Cdiff[iPatch*(patchSize*patchSize)*2 + offset+(patchSize*patchSize)] = pixelVbelowP;
            offset++;
        

        ...
        ...

    
         

我忘记在计算索引时使用blockSize,所以在块的每次迭代中,它都从第 0 个位置开始写入。

谁能解释我如何/为什么没有正确报告 Xcode 这些类型的 seg_faults?实际上,我必须测试我的代码并在 linux 上对其进行调试,以便能够捕获该错误。 Xcode中有没有类似Valgrid的工具可以帮助我调试?

【问题讨论】:

【参考方案1】:

只有当您的代码访问不属于它或不存在的内存时,您才会收到段错误。因为CDiff 在堆上,所以很可能在它之前和之后都有你的进程拥有并可以访问但尚未分配的内存。所以没有段错误是有道理的。 (也可能是为其他变量分配给您的内存,因此您正在覆盖该变量,但它直到后来才显示出来。)

您可以打开malloc scribbling and guard malloc 来帮助查找其中一些问题。您也可以使用Instruments 和clang static analyzer。

【讨论】:

如果你还没有升级到小牛,你可以使用valgrind。否则,您可以在 VM 中运行一些 linux 发行版并运行 valgrind。 我已经升级到 Mavericks。但是我能够使用 Valgrind 进行调试,并找出在 Xcode 中很难追踪的 bug。

以上是关于Xcode 5.0.1 中未报告分段错误的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 中未找到 Kiwi 文件错误

Xcode 7 中未找到解析 UI 错误

分段错误:11 - Xcode 10

XCode 中忽略了分段错误

由于信号导致命令失败:分段错误:11 Xcode 8.0

尝试以编程方式加载笔尖,接收 Xcode 6 中未遇到的无数错误