2011-01-27 7 views
5

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 
+6

Essere inseriti in un registro non è l'unica ottimizzazione possibile che potrebbe essersi verificata qui. –

+2

potresti controllare i tuoi log del compilatore? probabilmente hai da qualche parte sovrascritto il tuo -0? – fazo

+0

se si dispone di '()' QGridLayout * layout = new QGridLayout-> QUI <-; ?? – fazo

risposta

3

Usa volatile. Forse, ti aiuterà!

Why do we use volatile keyword in C++?

+0

Spiegazione interessante. Sfortunatamente, con 'volatile', gdb mi dice' Errore: impossibile creare l'oggetto variabile' – kaneda

+0

@kaneda: puoi pubblicare più codice in modo che possiamo capire meglio il tuo problema? – Nawaz

+0

Per favore, vedi ** EDIT1 ** sulla mia domanda. – kaneda

3

Che altro compilatore bandiere avete impostato?

Prova:

-g -O0 -fno-inline 
+0

Per favore, vedi ** EDIT1 ** sulla mia domanda. – kaneda

+0

Modificata la mia risposta in base alla modifica :) – GrahamS

+0

Grazie per la risposta, vedere il mio ** EDIT2 ** – kaneda

2

Un modo semplice per forzare una variabile da assegnare è quello di copiare un puntatore ad esso ad una variabile globale.

QGridLayout **dummy; // at file scope 

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

Questo forzerà il compilatore di versare la variabile di memoria prima di chiamare qualsiasi funzione non incorporato, come non si può dimostrare che la funzione non accedere direttamente alla variabile.

Questo può, naturalmente, avere impatti sulle prestazioni, ma è probabile che siano piccoli rispetto al costo di chiamare le funzioni dei membri della GUI su QGridLayout.

+0

Stavo pensando qualcosa di simile; dichiarato un puntatore sull'ambito globale, per forzare il compilatore a posizionare un puntatore su di esso in memoria. Ma quello che ho fatto era semplicemente 'QGridLayout * fittizio; // ambito globale »ma immagino che sia leggermente diverso. – kaneda

+0

Questo impone solo l'oggetto _puntato su_ layout per essere scaricato nella memoria; questo è già implicito chiamando le funzioni sul layout. La chiave è forzare la variabile puntatore a essere scaricata nella memoria dove gdb può raggiungerla. – bdonlan

Problemi correlati