2011-01-27 9 views
5

Estoy desarrollando una aplicación simple en C++/Qt, y tengo la siguiente declaración:¿Cómo puedo declarar una variable que no se debe optimizar (poner en registro) para depurar en C++?

QGridLayout *layout = new QGridLayout;

estoy depuración de la aplicación usando GDB. Establecí un punto de interrupción, funciona bien, y el depurador llega a la línea. Pero si trato de inspeccionar el objeto declarado anteriormente consigo esta salida:

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

leí que este mensaje, "<value> optimized out>", se debe a que el compilador optimiza el código, y poner los datos en el registro. Estoy usando el compilador g ++, con el indicador -O0 (ninguna optimización) establecido.

¿Hay algo que me falta, o existe una forma de declarar una variable no optimizada, por ejemplo, en oposición al especificador de almacenamiento register? Estoy en Ubuntu 10.10 Maverick, kernel 2.6.35-24.

EDIT1

algo más de código:

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

Por razones desconocidas para mí, después de haber compilado con verbosa modo -v pabellón conjunto, el error no lo hizo aparecen más, incluso después de desarmarlo nuevamente. Ahora gdb crea la variable, y puedo inspeccionar su valor.

Para quienes están interesados, banderas del compilador establecen son:

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

Ser puesto en un registro no es la única optimización posible que puede haber ocurrido aquí. –

+2

¿podría verificar los registros de su compilador? probablemente tiene un lugar sobreescrito su -O0? – fazo

+0

si tiene '()' QGridLayout * layout = new QGridLayout-> HERE <-; ?? – fazo

Respuesta

3

Uso volatile. Tal vez, ¡te ayudará!

Why do we use volatile keyword in C++?

+0

Explicación interesante. Desafortunadamente, con 'volátil', gdb me dice' Error: no se puede crear el objeto variable' – kaneda

+0

@kaneda: ¿puedes publicar más código para que podamos entender mejor tu problema? – Nawaz

+0

Por favor, vea ** EDIT1 ** en mi pregunta. – kaneda

3

Lo banderas compilador otra has fijado?

Probar:

-g -O0 -fno-inline 
+0

Por favor, vea ** EDIT1 ** en mi pregunta. – kaneda

+0

Cambié mi respuesta en función de su edición :) – GrahamS

+0

Gracias por responder, por favor vea mi ** EDIT2 ** – kaneda

2

Una manera fácil de forzar una variable que se asignarán es copiar un puntero a ella a una variable global.

QGridLayout **dummy; // at file scope 

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

Esto forzará al compilador para derramar la variable en la memoria antes de llamar a cualquier función no-inline, ya que no puede probar que la función no tendría acceso a la variable directamente.

Esto, por supuesto, puede tener un impacto en el rendimiento, pero es probable que sea pequeño en comparación con el costo de llamar a las funciones de los miembros de la GUI en QGridLayout.

+0

Estaba pensando algo similar; declaró un puntero en el alcance global, para obligar al compilador a colocar un puntero en la memoria. Pero lo que hice fue solo 'QGridLayout * dummy; // alcance global' pero supongo que es ligeramente diferente. – kaneda

+0

Eso solo obliga al objeto designado por el diseño a enjuagarse a la memoria; esto ya está implícito al invocar funciones en el diseño. La clave es obligar a que la variable del puntero se vacíe a la memoria, donde gdb puede acceder a ella. – bdonlan

Cuestiones relacionadas