Я разрабатываю простое приложение на 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