2012-02-03 13 views
28

Używam gdb do debugowania programu w C++.Jak wyświetlić wartość zmiennej <optimized out> w C++?

mam ten kod:

int x = floor(sqrt(3)); 

i chcę zobaczyć wartość x. Jednak gdb twierdzi, że x to "< optimized_out>". Jak wyświetlić wartość x? Czy mogę zmienić flagę kompilatora?

+2

Powinna być dostępna, jeśli została skompilowana bez optymalizacji, tj. -O0 –

+4

Tak, ogólnie należy debugować kod z optymalizacją * wyłączona *. Użyj do tego flagi '-O0'. –

Odpowiedz

33

Przy wysokich poziomach optymalizacji kompilator może wyeliminować pośrednie wartości, jak już tu zauważyłeś. Istnieje wiele opcji:

  • Możesz zmniejszyć poziom optymalizacji, aby ułatwić śledzenie rzeczy przez debuggera. -O0 z pewnością zadziała (ale będzie dużo wolniej), -O1 może również działać poprawnie.
  • Możesz dodać pewne jawne instrukcje drukowania, aby zarejestrować wartość wyjściową.
  • Zazwyczaj można również zmusić kompilator do zachowania tej konkretnej wartości, powodując, że jest ona niestabilna (ale pamiętaj, aby ją unieruchomić, kiedy skończysz!). Zauważ jednak, że skoro przepływ sterowania również podlega zmianom w zoptymalizowanym kodzie, nawet jeśli widzisz wartość zmiennej, to może nie być całkiem jasne, w jakim punkcie kodu znajdujesz się, gdy patrzysz na zmienna, o której mowa.
+3

Często można także zdemontować funkcję i wydedukować, w jakim rejestrze rzeczywiście znajduje się zmienna "optimized out", i wydrukować tę zmienną. Trwają prace nad rozwojem, które sprawią, że GCC będzie emitować wystarczająco szczegółowe informacje debugowania, aby GDB mogło w przyszłości zrobić to za ciebie. –

+1

@EmpectedRussian, to może działać, jeśli zmienna faktycznie istnieje, ale możliwe jest wyeliminowanie faktycznej pracy obliczania zmiennej, więc nie działa we wszystkich przypadkach. – bdonlan

+0

Jest również możliwe, aby zmienna lokalna istniała tylko w rejestrze. 'gcc' może zoptymalizować twój kod w ten sposób - kolejna możliwa przyczyna niewidocznych zmiennych. Zobacz tę odpowiedź, aby zobaczyć, jak wyświetlić zmienne rejestru: http://stackoverflow.com/a/1354762/350875 – appas

13

Jeśli nie możesz lub nie chcesz wyłączyć optymalizację, to można spróbować deklarując zmienną jako lotnej. Zazwyczaj wystarcza to, aby kompilator zachował zmienną w ostatecznym kodzie.

Alternatywnie, w ostatnich wersjach GCC można wyłączyć optymalizację tylko dla funkcji, takich jak to:

void my_function() __attribute__((optimize(0))) 
{ 
    int x = floor(sqrt(3)); 
} 
+0

Dla mnie ten atrybut jest niezdefiniowany. Kiedy zamiast tego użyłem 'optnone', zmienna została zoptymalizowana niezależnie (clang 3.8). – starturtle

0

Stwórz własną „zmienną globalną” i wydrukować zoptymalizowaną się zmienną do tej zmiennej globalnej. Po zakończeniu debugowania usuń utworzone globale!

Powiązane problemy