Как я могу объявить переменную, которую нельзя оптимизировать (поместить в регистр) для отладки в C ++? - PullRequest
5 голосов
/ 27 января 2011

Я разрабатываю простое приложение на C ++ / Qt , и у меня есть следующее объявление:

QGridLayout *layout = new QGridLayout;

Я отлаживаю приложение, используя GDB .Я установил точку останова, она отлично работает, и отладчик попадает в линию.Но если я попытаюсь проверить объект, объявленный выше, я получу следующий вывод:

-data-evaluate-expression --thread 1 --frame 0 layout 
^done,value="<value> optimized out>"

Я прочитал, что это сообщение, "<value> optimized out>", происходит потому, что компилятор оптимизировал код, и поставилданные в реестр.Я использую компилятор g ++ , с установленным флагом -O0 (без оптимизации).

Есть ли что-то, чего мне не хватает, или существует способ объявить переменную, чтобы небыть оптимизированным, скажем, в отличие от спецификатора хранилища register?Я в Ubuntu 10.10 Maverick, ядро ​​2.6.35-24.

EDIT1

Еще немного кода:

WorkspaceChooserDialog::WorkspaceChooserDialog(QWidget *parent) : QDialog(parent)
{
    setWindowTitle(tr("Select a workspace location"));
    QLabel *wpLabel = new QLabel(tr("Workspace:"), this);
    QLineEdit *wpLineEdit = new QLineEdit(QDir().homePath(), this);
    QPushButton *okButton = new QPushButton(tr("OK"), this);
    QPushButton *cancelButton = new QPushButton(tr("Cancel"), this);
    QGridLayout *layout = new QGridLayout;

    connect(okButton, SIGNAL(clicked()), this, SLOT(accept()));
    connect(cancelButton, SIGNAL(clicked()), this, SLOT(reject()));

    qDebug() << "begin: " << layout << " :end";
    layout->addWidget(wpLabel, 0, 0);
    layout->addWidget(wpLineEdit, 0, 1, 1, 2);
    layout->addWidget(okButton, 1, 1);
    layout->addWidget(cancelButton, 1, 2);
    setLayout(layout);
}

EDIT2

По неизвестным мне причинам после того, как я скомпилировал с установленным флагом подробного режима -v, ошибка больше не появлялась, даже после ее повторного сброса.Теперь GDB создает переменную, и я могу проверить ее значение.

Для тех, кто заинтересован, установлены флаги компилятора:

g++ -O0 -g3 -Wall -c -fmessage-length=0

Ответы [ 3 ]

3 голосов
/ 27 января 2011

Какие еще флаги компилятора вы установили?

Попытка:

-g -O0 -fno-inline
3 голосов
/ 27 января 2011

Используйте volatile.Возможно, это поможет вам!

Почему мы используем ключевое слово volatile в C ++?

2 голосов
/ 27 января 2011

Простой способ заставить переменную быть выделенной - скопировать указатель на нее на глобальную переменную.

QGridLayout **dummy; // at file scope

//...
dummy = &layout; // in function

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

Это, конечно, может повлиять на производительность, но они, вероятно, будут небольшими по сравнению со стоимостью вызова члена GUI.функции на QGridLayout.

...