Mingw Debug的奇怪行为

时间:2012-02-23 14:47:59

标签: c++ debugging mingw qt-creator

我在运行和调试这段代码时遇到问题:

bool readSectionHeaders(char* path, int numOfSections, int peSectionsOff, IMAGE_SECTION_HEADER* out) {
    bool retr = false; //return value

    //open file
    FILE* file;
    file = fopen (path, "rb");
    if(file == NULL) {
        perror("WRG"); //TODO
        return false;
    }

    do { //do while(false) only for easier error correction

        //seek to first section
        fseek(file, peSectionsOff, SEEK_SET);

        //read all sections
        unsigned int count;
        IMAGE_SECTION_HEADER sectionHeaders[numOfSections];
        count = fread(sectionHeaders, sizeof(IMAGE_SECTION_HEADER), numOfSections, file);

        //check Bytes count
        if(count != sizeof(IMAGE_SECTION_HEADER)*numOfSections) {
            break;
        }

        //copy sections
        memcpy(out, sectionHeaders, count);

        //exit successfully
        retr = true;
    } while(false);

    //exit
    fclose(file);

    return retr;
}

奇怪的是,即使它读取文件,它也会返回false。我试着调试它,这是最奇怪的部分。

我一行一行地直到这个

if(file == NULL) {

然后,即使file不是NULL,它也会跳过perror并移至

return false;

但根本不回来。

我再次一行一行直到

retr = true;

它似乎做了什么,但是后来仍然是假的。

然后它关闭文件并返回false。

我从未遇到过这样的事情。 我尝试清理项目,重建,甚至删除文件,并从subversion重新加载它们。在使用此功能之前,我使用类似的功能 - 我读取PE头。所以我虽然问题可能在于读取文件但它没有解释调试行为。

从函数返回后,我使用perror并写入No error。

我在QtCreator中使用mingw。

提前致谢。

2 个答案:

答案 0 :(得分:0)

我会做更像这样的事情,如果它能够加载整个数组,那么它将返回true。

std::ofstream file(path, std::ios::binary);

if(!file) {
    std::cerr << "failed to load file" << std::endl;
    return false;
}   

file.seekg (peSectionsOff, ios::beg);

IMAGE_SECTION_HEADER sectionHeaders[numOfSections];
size_t size=sizeof(sectionHeaders)*numOfSections;

return  //return true if the whole buffer is filled
    file.readsome(static_cast<char*>(sectionHeaders), size) == size;

UNTESTED

这可能会有所帮助 http://en.cppreference.com/w/cpp/io

答案 1 :(得分:0)

好的,这是我和明星的问题。我重新安装了整个QtSDK没有任何效果。然后我安装了不同版本的mingw并设置qt creator以使用它。现在调试器没有问题。我不确定发生了什么,但cerr&lt;&lt; “测试”;也停止了与老明星合作,这是100%正确。

正如111111所建议的,问题在于if break子句。我认为read返回读取的字节数,这根本不是真的:)。

现在它正在工作,感谢111111的建议:)。