我使用gdb來調試C++程序。如何在C++中查看<optimized out>變量的值?
我有這樣的代碼:
int x = floor(sqrt(3));
,我想查看x的值。但是,gdb聲稱x是「< optimized_out>」。我如何查看x的值?我應該改變我的編譯器標誌嗎?
我使用gdb來調試C++程序。如何在C++中查看<optimized out>變量的值?
我有這樣的代碼:
int x = floor(sqrt(3));
,我想查看x的值。但是,gdb聲稱x是「< optimized_out>」。我如何查看x的值?我應該改變我的編譯器標誌嗎?
在高優化級別上,編譯器可以消除中間值,如您在此處所見。有多種選擇:
-O0
肯定會起作用(但速度會相當慢),-O1
也可能正常工作。您通常也可以反彙編該函數並推導出「優化出」變量真正駐留的寄存器,並打印該變量。正在開發的努力正在使GCC發出足夠詳細的調試信息,以便GDB將來能夠爲您做到這一點。 – 2012-02-03 05:11:11
@EmployedRussian,如果變量確實存在,這可以工作,但是可以將計算變量的實際工作排除在外,所以它在任何情況下都不起作用。 – bdonlan 2012-02-03 05:12:32
局部變量也可以只存在於寄存器中。 'gcc'可以優化你的代碼,使其成爲不可查看變量的另一個可能原因。看到這個答案如何查看寄存器變量:http://stackoverflow.com/a/1354762/350875 – appas 2015-06-30 23:04:49
如果您不能或不想禁用優化,那麼你可以嘗試把變量聲明爲揮發性。 這通常足以讓你的編譯器保留最終代碼中的變量。
另外,在最近版本的GCC,你可以只是一個功能禁用優化,如:
void my_function() __attribute__((optimize(0)))
{
int x = floor(sqrt(3));
}
對我來說,這個屬性是未定義的。當我使用'optnone'時,無論如何(cla 3.8),變量都得到了優化。 – starturtle 2016-08-04 08:18:54
創建自己的「全局變量」,並打印出優化變量到這個全局變量。確保在完成調試後刪除由您創建的全局變量!
它應該可用,如果你編譯沒有優化,即-O0 – 2012-02-03 04:28:26
是的,你通常應該優化調試代碼* disabled *。使用'-O0'標誌。 – 2012-02-03 04:30:03