[英]How do I view the value of an <optimized out> variable in C++?
我正在使用 gdb 調試 C++ 程序。
我有這段代碼:
int x = floor(sqrt(3));
我想查看 x 的值。 但是,gdb 聲稱 x 是“<optimized_out>”。 如何查看x的值? 我應該更改我的編譯器標志嗎?
在高優化級別,編譯器可以消除中間值,如您在此處所見。 有多種選擇:
-O0
肯定可以工作(但會慢很多),- -O1
也可能工作正常。如果您不能或不想禁用優化,那么您可以嘗試將該變量聲明為volatile 。 這通常足以讓您的編譯器在最終代碼中保留變量。
或者,在最近的 GCC 版本中,您可以僅對一個函數禁用優化,如下所示:
void my_function() __attribute__((optimize(0)))
{
int x = floor(sqrt(3));
}
使用反向調試時,盡量往后退一步,靠近變量的定義點
如: gdb中<值優化輸出>是什么意思? 通常情況下,在函數內:
<optimized out>
,因為它由於優化而僅存儲在寄存器中,而不是存儲在堆棧中的內存中。 因此,當不再需要它時,該寄存器很可能會被另一個變量重用和覆蓋,然后調試元數據會通知 GDB。 因此,如果您正在使用某種反向調試,例如 Mozilla rr
,一旦您嘗試一次,您就會一直這樣做,那么一個好的選擇是嘗試退回到定義點/最后一次使用變量與reverse-finish
+ reverse-next
,看看你是否可以在那里觀察它。
這可以通過在 gdb中什么是<值優化輸出> 中顯示的示例代碼來具體觀察? 並且已經救了我幾次,特別是當運行未優化的程序使得到達興趣點需要很長時間時(考慮到-O0
生成的非常低效的程序集,如該答案所示,這並不奇怪)。
創建您自己的“全局變量”並將優化的輸出變量打印到此全局變量中。 完成調試后,請確保刪除這些由您創建的全局變量!
在帶有 VisualGDB 擴展的 Visual Studio 中使用 C++,我看到類范圍的變量在語法上是正確的,但是通過運行時變量檢查和 hover 文本聲稱值已被優化,即使它們實際上不是。
為了查看值,在變量名前面加上快速監視中的 class 名稱或觀看 window 為我解析。
例如:在myclass
中似乎被優化掉的myvariable
值可以用myclass::myvariable
查看。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.