gdb控件跳转到随机位置

gdb control jumping to random position

本文关键字:随机 位置 控件 gdb      更新时间:2023-10-16

以下是我想要调试的代码片段:当我尝试使用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 = %dn", k, j, gtVal);
    }
    int dummy = 0; 
    printf("i = %dn", i);
}

以下是gdb控制台的快照:

Breakpoint 2, LDenseUnaryPixelPotential::InitTrainData (this=0x80aad08, trainImageFiles=...) at potential.cpp:665
665         int dummy = 0; 
(gdb) n
666         printf("i = %dn", 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选项进行编译,现在使用-g-O0选项进行编译。同样的问题仍然存在。

这是我的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坏了,生成了错误的调试行信息。