0

デバッグしたいコードスニペットは次のとおりです。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から640に直接移動するのではなく、666から650に移動してから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
4

2 に答える 2

1

実際にデバッグしてみると、コントロールがループの最後に到達すると、「LLabelImage」のデストラクタが呼び出されてデータが削除されていることがわかりました。

于 2012-10-31T05:06:46.543 に答える
0

GDB を使用してデバッグしようとすると、i = 0 のループが終了した後、i = 1 のループ内の最初の行にジャンプしません。

これは、コンパイル済みコードでは発生しないはず-O0です。

実際にはそのようにコンパイルしていないか(たとえば、ある実行可能ファイルをコンパイルし、別のものを誤ってデバッグした場合に発生する可能性があります)、または GCC が壊れていて、不適切なデバッグ行情報が生成されます。

于 2012-09-10T14:13:30.803 に答える