【发布时间】:2016-06-27 17:49:09
【问题描述】:
在 GDB 宏中,我可以这样做:
set $node = (node_t *) $arg0
当 node_t 实际定义在库文件中时。如何在 LLDB Python 宏中进行相同性质的转换操作?
【问题讨论】:
在 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 指针,它确实可以正常工作。
【讨论】: