2017-01-30 34 views

回答

1

由於Cast不是真正的C++類型轉換,因此不推薦使用Cast。特別是如果您從指向基類的指針轉換爲其父類的指針,SBValue::Cast不會將基類的位置考慮在其父項中,並相應地偏移指針。它所做的就是提取原始值對象的地址並將THAT轉換爲新類型。不幸的是,Cast的各種用法都依賴於這種簡單化的演員行爲,因此我們不能僅僅做出正確的選擇。

對於C & ObjC類型,這種「Cast」不會導致任何問題。對於具有單一繼承的C++類,它也總是正確的。當從一個基類強制轉換爲從多個類繼承的父類(並且該基類不是繼承層次中的第一個類)時,它將失敗。

任何「評估表達式」強制轉換表達式應該可以工作,clang將在它生成的代碼中獲得抵消權。因此,例如:

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

SBFrame::EvaluateExpression將搜索類型&全局可見對象從目前的範圍向外移動。因此,如果存在多個在同一級別上可見的不兼容類型/變量,則只能從其他上下文中找到變量&類型。

解決此問題的另一種方法是手動定義所需的類型。在lldb中,如果您編寫一個定義類型的表達式,併爲該類型指定一個以$開頭的名稱,則該類型將在未來的表達式評估中可用。取決於隱藏類型的複雜程度,您可以將類型定義複製到lldb便捷類型中,然後使用它。

真正的解決方案是爲表達式解析器(相當於gdb的「::」)添加一些語法來指定符號名稱的上下文。但是這項工作尚未完成。或者,當然,添加一個真正的C++感知SBValue :: Cast。

+0

但是,如果MyType在另一個嵌套範圍內,並且因此在沒有全局搜索的情況下不可見,該怎麼辦? – random

+0

首先,除非您正在打印父類中基底偏移的類型,否則Cast應該沒問題。在我們調用SB API的2.0版本之前,API不會消失。代碼警告更多的是說這個「Cast」方法不是一個真正的Cast ... –

+0

注意,如果你寫一個表達式來定義一個類型,並給這個類型一個以$開頭的名字,那麼這個類型將會是可用於未來的表情評估。取決於隱藏類型的複雜程度,您可以將類型定義複製到lldb便捷類型中,然後使用它。隨處可見。 –

相關問題