2012-02-03 375 views
28

我使用gdb來調試C++程序。如何在C++中查看<optimized out>變量的值?

我有這樣的代碼:

int x = floor(sqrt(3)); 

,我想查看x的值。但是,gdb聲稱x是「< optimized_out>」。我如何查看x的值?我應該改變我的編譯器標誌嗎?

+2

它應該可用,如果你編譯沒有優化,即-O0 – 2012-02-03 04:28:26

+4

是的,你通常應該優化調試代碼* disabled *。使用'-O0'標誌。 – 2012-02-03 04:30:03

回答

33

在高優化級別上,編譯器可以消除中間值,如您在此處所見。有多種選擇:

  • 您可以減少優化級別,使調試器更容易跟蹤事情。 -O0肯定會起作用(但速度會相當慢),-O1也可能正常工作。
  • 您可以添加一些顯式打印語句來記錄輸出值。
  • 您通常也可以強制編譯器通過使其變爲易失性來保留該特定值(但請記住在完成時不要使其變爲易失性!)。但是,請注意,由於控制流也可能會改變優化代碼,即使您可以看到變量的值,也可能不完全清楚您在查看代碼時所處的代碼點有問題的變量。
+3

您通常也可以反彙編該函數並推導出「優化出」變量真正駐留的寄存器,並打印該變量。正在開發的努力正在使GCC發出足夠詳細的調試信息,以便GDB將來能夠爲您做到這一點。 – 2012-02-03 05:11:11

+1

@EmployedRussian,如果變量確實存在,這可以工作,但是可以將計算變量的實際工作排除在外,所以它在任何情況下都不起作用。 – bdonlan 2012-02-03 05:12:32

+0

局部變量也可以只存在於寄存器中。 'gcc'可以優化你的代碼,使其成爲不可查看變量的另一個可能原因。看到這個答案如何查看寄存器變量:http://stackoverflow.com/a/1354762/350875 – appas 2015-06-30 23:04:49

13

如果您不能或不想禁用優化,那麼你可以嘗試把變量聲明爲揮發性。 這通常足以讓你的編譯器保留最終代碼中的變量。

另外,在最近版本的GCC,你可以只是一個功能禁用優化,如:

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

對我來說,這個屬性是未定義的。當我使用'optnone'時,無論如何(cla 3.8),變量都得到了優化。 – starturtle 2016-08-04 08:18:54

0

創建自己的「全局變量」,並打印出優化變量到這個全局變量。確保在完成調試後刪除由您創建的全局變量!

相關問題