Sto sviluppando una semplice applicazione in C++/Qt, e ho la seguente dichiarazione:Come posso dichiarare una variabile che non deve essere ottimizzata (messa in registro) per eseguire il debug in C++?
QGridLayout *layout = new QGridLayout;
che sto debug dell'applicazione utilizzando gdb. Ho impostato un punto di interruzione, funziona bene e il debugger fa la fila. Ma se provo a ispezionare l'oggetto riportate precedentemente ottengo questo output:
-data-evaluate-expression --thread 1 --frame 0 layout ^done,value="<value> optimized out>"
ho letto che questo messaggio, "<value> optimized out>"
, si verifica perché il compilatore ottimizzato il codice, e mettere i dati nel registro. Sto usando il compilatore g ++, con il flag -O0
(nessuna ottimizzazione) impostato.
C'è qualcosa che mi manca o esiste un modo per dichiarare una variabile che non deve essere ottimizzata, ad esempio in contrapposizione allo specificatore di memoria register
? Sono su Ubuntu 10.10 Maverick, kernel 2.6.35-24.
EDIT1
Alcuni codice più:
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
Per ragioni a me sconosciute, dopo aver compilato con verbose mode -v
flag impostato, l'errore non ha fatto apparire più, anche dopo averlo disinserito di nuovo. Ora gdb crea la variabile e sono in grado di controllarne il valore.
Per chi è interessato, le bandiere del compilatore impostati sono:
g++ -O0 -g3 -Wall -c -fmessage-length=0
Essere inseriti in un registro non è l'unica ottimizzazione possibile che potrebbe essersi verificata qui. –
potresti controllare i tuoi log del compilatore? probabilmente hai da qualche parte sovrascritto il tuo -0? – fazo
se si dispone di '()' QGridLayout * layout = new QGridLayout-> QUI <-; ?? – fazo