GDB контроль прыжков в случайное положение

Вот фрагмент кода, который я хочу отладить:
Когда я пытаюсь отладить с помощью GDB, после завершения цикла for i = 0, он не переходит на самую первую строку внутри цикла for i = 1, Вместо этого он переходит на другую строку в середине, а затем переходит на первую строку. Я не могу понять, почему и как это исправить. Пожалуйста, дайте мне ваш вклад.

for(i = 0; i < fileSum; i++)
{
char *fileName ; //= NULL;
//  fileName = GetFileName(dataset->groundTruthFolder, trainImageFiles[i], dataset->groundTruthExtension);

fileName = new char[strlen(dataset->groundTruthFolder) + strlen(trainImageFiles[i]) + strlen(dataset->groundTruthExtension) + 1];
sprintf(fileName, "%s%s%s", dataset->groundTruthFolder, trainImageFiles[i], dataset->groundTruthExtension);
printf("GetFileName: fileName-%s \n", fileName);LLabelImage groundTruth(fileName, domain);
//      delete[] fileName;
//      fileName = NULL;

int width = groundTruth.GetWidth(), height = groundTruth.GetHeight();

int subWidth = (width + subSample - 1) / subSample;
int subHeight = (height + subSample - 1) / subSample;

for(k = 0; k < subHeight; k++) for(j = 0; j < subWidth; j++)
{
unsigned char gtVal = groundTruth(j * subSample, k * subSample, 0);
if(gtVal > 0) classCounts[gtVal - 1]++, total++;
printf("k = %d,j = %d, gtVal = %d\n", k, j, gtVal);
}
int dummy = 0;
printf("i = %d\n", i);
}

Вот снимок консоли GDB:

Breakpoint 2, LDenseUnaryPixelPotential::InitTrainData (this=0x80aad08, trainImageFiles=...) at potential.cpp:665
665         int dummy = 0;
(gdb) n
666         printf("i = %d\n", i);
(gdb) n
i = 1
650         LLabelImage groundTruth(fileName, domain);
(gdb) n
640     for(i = 0; i < fileSum; i++)
(gdb) n

Breakpoint 1, LDenseUnaryPixelPotential::InitTrainData (this=0x80aad08, trainImageFiles=...) at potential.cpp:645
645         fileName = new char[strlen(dataset->groundTruthFolder) + strlen(trainImageFiles[i]) + strlen(dataset->groundTruthExtension) + 1];
(gdb)

Обратите внимание, что управление переходит от 666 до 650, а затем к 640, вместо того, чтобы идти прямо с 666 до 640.

Раньше я компилировал с опцией -g, теперь я скомпилировал с -г-0 вариант. Все та же проблема сохраняется.

Вот мой Makefile:

CC  =   g++
OBJS    =   main.o
SOURCES =   main.cpp
LIBS    =       -lIL -pthread
EXE =   ale
FLAGS   = -g -O0 -Wno-write-strings

$(EXE): .
$(CC) $(FLAGS) -c $(SOURCES) -o $(OBJS)
$(CC) -o $(EXE) $(OBJS) $(LIBS)
clean:
rm -rf *.o ale

0

Решение

На самом деле, я продолжил отладку и обнаружил, что когда элемент управления достигает конца цикла, вызывается деструктор «LLabelImage» для удаления данных.

1

Другие решения

Когда я пытаюсь выполнить отладку с использованием GDB, после того, как цикл завершается для i = 0, он не переходит на самую первую строку внутри цикла для i = 1.

Это не должно случиться с -O0-компилированный код

Либо ты на самом деле, нет компилирование таким образом (что может произойти, если вы, например, скомпилируете один исполняемый файл, но отладите другой по ошибке), или ваш GCC будет поврежден и сгенерирует неверную информацию о строке отладки.

0