Странное поведение Mingw Debug - PullRequest
       13

Странное поведение Mingw Debug

0 голосов
/ 23 февраля 2012

У меня проблема с запуском и отладкой этого фрагмента кода:

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) {

Тогда, даже если файл не равен NULL, он пропускает perror и перемещается в

return false;

Но не возвращается вообще.

Я снова иду построчно, пока

retr = true;

, где, кажется, что-то делает, однако retr остается ложным.

Затем он закрывает файл и возвращает значение false.

Я никогда не сталкивался с чем-то подобным. Я пытался очистить проект, перестроить, даже удалить файлы и загрузить их из Subversion. Прежде чем использовать эту функцию, я использую аналогичную - я читаю PE заголовки. Таким образом, я думаю, что проблема может быть в чтении файла, но это не объясняет поведение отладки.

После возвращения из функции я использую perror, и она пишет No error.

Я использую Mingw с QtCreator.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 24 февраля 2012

Хорошо, это была проблема и моей, и mingw. Я переустановил весь QtSDK без эффекта. Затем я установил другую версию mingw и настроил qt creator для ее использования. Теперь отладчик работает без проблем. Я не уверен, что случилось, но cerr << "TEST"; также перестал работать со старым Mingw, и это на 100% правильно. </p>

Как предлагал 111111, проблема заключалась в предложении if break. Я думал, что read возвращает количество прочитанных байтов, и это было просто неверно :)

Теперь он работает, спасибо 111111 за его предложение:).

0 голосов
/ 23 февраля 2012

Я бы сделал что-то вроде этого, если он сможет загрузить весь массив, тогда он вернет 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

...