2017-01-30 33 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便捷类型中,然后使用它。随处可见。 –

相关问题