Вот фрагмент кода, который я хочу отладить:
Когда я пытаюсь отладить с помощью 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
На самом деле, я продолжил отладку и обнаружил, что когда элемент управления достигает конца цикла, вызывается деструктор «LLabelImage» для удаления данных.
Когда я пытаюсь выполнить отладку с использованием GDB, после того, как цикл завершается для i = 0, он не переходит на самую первую строку внутри цикла для i = 1.
Это не должно случиться с -O0
-компилированный код
Либо ты на самом деле, нет компилирование таким образом (что может произойти, если вы, например, скомпилируете один исполняемый файл, но отладите другой по ошибке), или ваш GCC будет поврежден и сгенерирует неверную информацию о строке отладки.