[英]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.