簡體   English   中英

LLDB API:為什么不建議使用SBValue :: Cast,以及如何用CreateValueFromExpression替換它?

[英]LLDB API: Why SBValue::Cast is deprecated and how to replace it with CreateValueFromExpression?

SBValue :: Cast在LLDB標頭中標記為已棄用:

// Deprecated - use the expression evaluator to perform type casting
lldb::SBValue Cast(lldb::SBType type);

但是我不明白如何用表達式求值代替它。

假設我有:

auto casted_val = my_value.Cast(my_type);

考慮到值和類型都可能超出當前范圍,等效表達式是什么?

不推薦使用Cast,因為它不是真正的C ++ Cast。 特別是,如果您從一個指向基類的指針轉換為其父類的指針,則SBValue::Cast不會考慮基類在其父級中的位置並相應地使指針偏移。 它所做的只是提取原始值對象的地址並將THAT強制轉換為新類型。 不幸的是,Cast的各種用法都依賴於這種簡單的轉換行為,而我們不能僅僅做到正確。

對於C&ObjC類型,這種“廣播”不會引起任何問題。 對於具有單一繼承的C ++類,它也總是正確的。 從基類強制轉換為從多個類繼承的父類時,它將失敗(並且基類不是繼承層次結構中的第一個類)。

任何帶有適當強制轉換表達式的“求值表達式”調用都應該起作用,clang將在其生成的代碼中獲得正確的偏移量。 因此,例如:

casted_value = frame.EvaluateExpression("(MyType *) var_to_cast");

SBFrame::EvaluateExpression將搜索從當前范圍向外移動的類型和全局可見的對象。 因此,僅當在同一級別上有多個不兼容的類型/變量可見時,才可以從其他上下文中查找變量和類型。

解決此問題的另一種方法是手動定義所需的類型。 在lldb中,如果您編寫一個定義類型的表達式,並給該類型起一個以$開頭的名稱,則該類型將在以后的表達式評估中可用。 根據隱藏類型的復雜程度,您可以將類型定義復制到lldb便利類型中,並使用它。

真正的解決方案是在表達式解析器中添加一些語法(相當於gdb的“ ::”),以指定符號名稱的上下文。 但是,這項工作還沒有完成。 或者,當然,添加一個真正的C ++感知SBValue :: Cast。

暫無
暫無

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

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