Ошибка сегментации не сообщается в Xcode 5.0.1

Я отлаживал код, в котором было довольно сложно обнаружить одну из моих ошибок. Я объявил и массив как

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 ответ

Решение

Вы получите segfault только в том случае, если ваш код обращается к памяти, которая ему не принадлежит или не существует. Так как CDiff находится в куче, вполне вероятно, что до и после него есть память, которой владеет и имеет доступ ваш процесс, но которая еще не была выделена. Так что имеет смысл, что нет никакого segfault. (Это также может быть память, которая была выделена вам для какой-то другой переменной, поэтому вы перезаписывали эту переменную, но она не появилась позже).

Вы можете включить настройку malloc и защитить malloc, чтобы помочь найти некоторые из этих проблем. Вы также можете использовать инструменты и статический анализатор лязга.

Другие вопросы по тегам