LLDB API:为什么 SBValue::Cast 被弃用以及如何用 CreateValueFromExpression 替换它?
LLDB API: Why SBValue::Cast is deprecated and how to replace it with CreateValueFromExpression?
SBValue::Cast 在 LLDB 中标记为已弃用 headers:
// 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++ 转换。特别是如果你从一个指向基 class 的指针转换为它的父 class,SBValue::Cast
不会考虑基 [=29] 的位置=] 在它的父级中并相应地偏移指针。它所做的只是提取原始值对象的地址并将其转换为新类型。不幸的是,Cast 的各种用途都依赖于这种简单的转换行为,我们不能只做对。
对于 C 和 ObjC 类型,这种 "Cast" 不会造成任何问题。对于单继承的 C++ classes,它也总是正确的。当从基础 class 转换为从多个 class 多重继承的父级时,它将失败(并且基础不是继承层次结构中的第一个 class。)
任何具有适当转换表达式的 "evaluate expression" 调用都应该有效,clang 将在它生成的代码中获得正确的偏移量。例如:
casted_value = frame.EvaluateExpression("(MyType *) var_to_cast");
SBFrame::EvaluateExpression
将搜索从当前范围向外移动的类型和全局可见对象。因此,如果有多个不兼容的 types/variables 在同一级别可见,那么从其他上下文中查找变量和类型应该只是问题。
解决此问题的另一种方法是手动定义所需的类型。在 lldb 中,如果您编写一个定义类型的表达式,并为该类型指定一个以 $ 开头的名称,该类型将在以后的表达式评估中可用。根据隐藏类型的复杂程度,您可以将类型定义复制到 lldb 便利类型中,然后使用它。
真正的解决方案是在表达式解析器中添加一些语法(相当于 gdb 的“::”)来指定符号名称的上下文。但是那部分工作还没有完成。或者,当然,添加一个真正的 C++ 感知 SBValue::Cast.
SBValue::Cast 在 LLDB 中标记为已弃用 headers:
// 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++ 转换。特别是如果你从一个指向基 class 的指针转换为它的父 class,SBValue::Cast
不会考虑基 [=29] 的位置=] 在它的父级中并相应地偏移指针。它所做的只是提取原始值对象的地址并将其转换为新类型。不幸的是,Cast 的各种用途都依赖于这种简单的转换行为,我们不能只做对。
对于 C 和 ObjC 类型,这种 "Cast" 不会造成任何问题。对于单继承的 C++ classes,它也总是正确的。当从基础 class 转换为从多个 class 多重继承的父级时,它将失败(并且基础不是继承层次结构中的第一个 class。)
任何具有适当转换表达式的 "evaluate expression" 调用都应该有效,clang 将在它生成的代码中获得正确的偏移量。例如:
casted_value = frame.EvaluateExpression("(MyType *) var_to_cast");
SBFrame::EvaluateExpression
将搜索从当前范围向外移动的类型和全局可见对象。因此,如果有多个不兼容的 types/variables 在同一级别可见,那么从其他上下文中查找变量和类型应该只是问题。
解决此问题的另一种方法是手动定义所需的类型。在 lldb 中,如果您编写一个定义类型的表达式,并为该类型指定一个以 $ 开头的名称,该类型将在以后的表达式评估中可用。根据隐藏类型的复杂程度,您可以将类型定义复制到 lldb 便利类型中,然后使用它。
真正的解决方案是在表达式解析器中添加一些语法(相当于 gdb 的“::”)来指定符号名称的上下文。但是那部分工作还没有完成。或者,当然,添加一个真正的 C++ 感知 SBValue::Cast.