我正在使用 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。
编辑1
更多代码:
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);
}
编辑2
出于我未知的原因,在我使用详细模式
-v
标志进行编译后,即使再次取消设置后,错误也不再出现。现在 gdb 创建了变量,我可以检查它的值。
对于感兴趣的人,编译器的标志集是:
g++ -O0 -g3 -Wall -c -fmessage-length=0
您还设置了哪些其他编译器标志?
尝试:
-g -O0 -fno-inline
强制分配变量的一个简单方法是将指向该变量的指针复制到全局变量。
QGridLayout **dummy; // at file scope
//...
dummy = &layout; // in function
这将迫使编译器在调用任何非内联函数之前将变量溢出到内存中,因为它无法证明该函数不会直接访问该变量。
当然,这可能会对性能产生影响,但与在 QGridLayout 上调用 GUI 成员函数的成本相比,它们可能很小。