簡體   English   中英

lldb 錯誤:變量不可用

[英]lldb error: variable not available

這是我的兩行代碼:

NSString *frontFilePath = [[NSBundle mainBundle] pathForResource:[self.bookendFileNames objectAtIndex:self.randomIndex] ofType:@"caf"];
NSLog(@"frontFilePath = %@", frontFilePath );

我在第二行放了一個斷點,當在那里時,我嘗試打印它:

(lldb) po frontFilePath

但我收到以下錯誤:

error: variable not available

我很困惑,因為如果我跳過 NSLog 語句,變量確實會打印到控制台。

對於它的價值,我正在嘗試調試第一行,因為有時它返回 NULL,但我現在無法弄清楚原因。

這是調試優化代碼的神器。 當編譯器的優化在您的構建設置中啟用時,它會在內存和寄存器之間移動變量,因為它認為是最好的。 在您檢查 lldb 中的變量時,它可能根本不存在於寄存器或內存中——即使它看起來應該仍可用於顯示。

可能是編譯器輸出的調試信息存在缺陷。 有時,編譯器會將變量復制到寄存器中供其使用,並且僅在調試信息中列出該寄存器的位置。 后來寄存器被重新用於其他用途; value 仍然存在於堆棧中,但編譯器沒有告訴調試器可以在那里找到該值。

真正判斷它是調試信息不​​足還是該特定指令中的值確實不存在的唯一方法是手動檢查匯編代碼。 一旦您使用編譯器打開優化,源代碼就會成為以任何特定順序實際執行的內容的弱視圖。

如果可能的話,我強烈建議關閉優化(構建設置中的優化級別)並以這種方式調試,而不是在優化代碼調試的古怪世界中徘徊太遠。 如果您確實需要通過優化調試應用程序,請確保您使用 Xcode 支持的最新 Apple LLVM 編譯器進行構建 - 一直在努力改進優化代碼調試,並且您希望充分利用自己到目前為止,您可以使用工具。

在 Swift 中,可能從 Xcode 9 開始,但在 Xcode 10 中仍然存在問題,甚至在構建設置中關閉代碼優化時也會出現這種情況。 正如@carlos_ms 在這里指出的,臨時解決方案是將變量定義為可變的,即

轉動

let foo = Bar().string

進入

var foo = Bar().string

為了使優化跳過此變量。 請注意,這可能不適用於所有情況。

在這種情況下,一個好的 ol' debugPrint()可能會幫助你。

診斷中的“Address Sanitizer”似乎也使變量的值不可用。

方案 > 運行 > 診斷 > 地址清理

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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