переход с GDB, кажется, показывает программные операторы, не имеющие никакого эффекта - PullRequest
2 голосов
/ 22 февраля 2012

У меня есть структура, которая объявлена ​​в стеке.Вот как выглядит структура:

struct MyStruct {
    int integer;
    std::vector<bool > booleanVector;
};

Когда я выполняю следующую функцию с помощью gdb, печатая значения s.integer и s.booleanVector.size(), операторы, похоже, не действуют.

MyStruct getMyStruct()
{
    MyStruct s;   
    s.integer = 3;
    s.booleanVector.resize( s.integer );
    return s;
}

Однако, когда я вставляю операторы печати, такие как std::cout << s.integer << std::endl;, вывод показывает, что значения s.integer и s.booleanVector.size() были правильно изменены.

Я обнаружил, что проблема кажетсябыть связанным со структурой, возвращаемой функцией, в которой она объявлена.Проблема с отображением недопустимой информации о структуре в gdb, если она не возвращается функцией, в которой она объявлена.

Это упрощенный пример, демонстрирующий проблему, с которой я столкнулся при попытке отладкипроект.Эта проблема с gdb отвлекала меня от реальной ошибки в моем коде и затрудняла ее поиск (изначально я думал, что проблема может быть в незначительной ошибке в моем коде, поэтому я и разместил ее здесь). Здесь - это полная небольшая программа, которая демонстрирует такое поведение в моей системе.

Я предполагаю, что мой вопрос заключается в том, является ли это просто ошибкой в ​​gdb или это поведение возникает в результате того, как gccобрабатывает структуры / классы, которые должны быть возвращены из функции.

Примечание. Использование gdb 6.3 с gcc 4.2 в Mac OSX 10.6 (Snow Leopard)

Ответы [ 2 ]

2 голосов
/ 23 марта 2013

Это ошибка в GCC (см. Ссылку ниже).

Это также происходит при использовании следующей версии GDB:

i686-apple-darwin9-g ++ - 4.0.1 (GCC) 4.0.1 (Apple Inc., сборка 5493) Copyright (C) 2005 Free Software Foundation, Inc.

... и даже при компиляции с -O0

Вот ссылка на полный трекер ошибок в проекте GCC:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44731

Произведенные программы являются правильно работающими программами.Проблема была полностью связана с оптимизацией, имеющей эффект даже при сборке, установленной как «ноль оптимизаций», и с неправильной отладочной информацией, помещенной в двоичный файл gcc.

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

Эта проблема отладки устранена путем обновления до более поздней версии gcc. Когда код скомпилирован с gcc 4.7, gdb отображает правильную информацию о структуре.

...