簡體   English   中英

我如何查看一個值<optimized out> C++ 中的變量?</optimized>

[英]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 來強制編譯器保留此特定值(但請記住在完成后將其取消設置為 volatile!)。 但是請注意,由於優化代碼中的控制流也會發生變化,即使您可以看到變量的值,當您查看代碼時,可能並不完全清楚您所在的代碼點有問題的變量。

如果您不能或不想禁用優化,那么您可以嘗試將該變量聲明為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM