2011-01-27 11 views
5

Zajmuję prostą aplikację w C++ /Qt i mam następującą deklarację:Jak mogę zadeklarować zmienną, której nie można zoptymalizować (wpisać do rejestru) w celu debugowania w C++?

QGridLayout *layout = new QGridLayout;

jestem debugowanie aplikacji przy użyciu gdb. Ustawiłem breakpoint, działa dobrze, a debugger trafia w linię. Ale gdy próbuję kontrolować przedmiot zadeklarowane powyżej uzyskać ten wynik:

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

Czytałem, że ten komunikat, "<value> optimized out>", występuje, ponieważ kompilator zoptymalizowany kod i umieścić dane w rejestrze. Korzystam z kompilatora g ++, z ustawioną flagą -O0 (brak optymalizacji).

Czy jest coś, czego mi brakuje, czy też istnieje sposób deklarowania zmiennej, która nie ma być zoptymalizowana, powiedzmy, w przeciwieństwie do specyfikatora pamięci register? Jestem na Ubuntu 10.10 Maverick, jądro 2.6.35-24.

Edit1

Niektóre bardziej Kod:

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

Na nieznanych mi przyczyn, po skompilowany z gadatliwym Tryb -v flagą, błąd nie pojawiają się już, nawet po ponownym rozbrojeniu. Teraz gdb tworzy zmienną i jestem w stanie sprawdzić jej wartość.

Dla zainteresowanych, flagi kompilatora za zestaw to:

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

Umieszczenie w rejestrze nie jest jedyną możliwą optymalizacją, która mogła wystąpić tutaj. –

+2

możesz sprawdzić swoje logi kompilatora? prawdopodobnie masz gdzieś nadpisane swoje -O0? – fazo

+0

powinieneś mieć '()' QGridLayout * layout = new QGridLayout-> HERE <-; ?? – fazo

Odpowiedz

3

Zastosowanie volatile. Może, to ci pomoże!

Why do we use volatile keyword in C++?

+0

Interesujące wyjaśnienie. Niestety, z 'volatile', gdb mówi mi' Błąd: Nie można utworzyć obiektu zmiennego ' – kaneda

+0

@kaneda: czy możesz dodać więcej kodu, abyśmy mogli lepiej zrozumieć twój problem? – Nawaz

+0

Proszę zobaczyć ** EDIT1 ** na moje pytanie. – kaneda

3

Jakie inne kompilator flagi nie można ustawić?

Spróbuj:

-g -O0 -fno-inline 
+0

Proszę zobaczyć ** EDIT1 ** na moje pytanie. – kaneda

+0

Zmieniono moją odpowiedź na podstawie Twojej edycji :) – GrahamS

+0

Dziękuję za odpowiedź, zobacz mój ** EDIT2 ** – kaneda

2

Łatwym sposobem, aby zmusić zmienną która ma zostać przydzielona jest skopiować wskaźnik do niego do zmiennej globalnej.

QGridLayout **dummy; // at file scope 

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

To zmusi kompilator rozlać zmienną do pamięci przed wywołaniem żadnej funkcji nie-inline, ponieważ nie można udowodnić, że funkcja nie będzie dostępu do zmiennej bezpośrednio.

Może to oczywiście mieć wpływ na wydajność, ale prawdopodobnie będzie niewielkie w porównaniu do kosztów wywoływania funkcji członków GUI w QGridLayout.

+0

Myślałem o czymś podobnym; zadeklarował wskaźnik na zasięgu globalnym, aby zmusić kompilator do umieszczenia w nim wskaźnika. Ale zrobiłem tylko manekina QGridLayout *; // globalny zasięg ", ale domyślam się, że jest bardzo różny. – kaneda

+0

Wymusza to tylko przepłukanie układu _pointed do układu by_ do pamięci; jest to już zasugerowane przez wywołanie funkcji na układzie. Kluczem jest wymuszenie, aby sama zmienna wskaźnika została przepłukana do pamięci, do której gdb może się dostać. – bdonlan

Powiązane problemy