LLDB Python API 类型转换

LLDB Python API type casting

在 GDB 宏中,我可以这样做:

set $node = (node_t *) $arg0

当node_t实际定义在库文件中时。我如何在 LLDB Python 宏中进行相同性质的转换操作?

有几种方法可以做到这一点。最简单的是使用 SBFrame.EvaluateExpression 比如:

options = lldb.SBExpressionOptions()
val = frame.EvaluateExpression("(node_t *) $arg1", options)

其中 frame 是您在其上下文中计算表达式的堆栈帧。

您也可以不使用表达式来执行此操作,如果您要经常执行此操作,效率会更高。

例如,如果你有一个地址和一个类型,那么你可以使用SBTarget.CreateValueFromAddress直接产生转换值。您可以使用 SBTarget.FindFirstType 查找类型。

如果您感兴趣的值在寄存器中,您可以从 SBFrame.FindRegister 中获取它的值,然后用 SBValue.Cast 转换它。在将一种复杂类型转换为另一种复杂类型时,该 Cast 函数并不总是有效 - 你需要为此使用表达式解析器 - 但对于简单的 C 指针,它确实可以正常工作。