问题在于 lldb 表达式解析器使用 C++ 引用来实现从我们运行的表达式中查找和提取结果的工作。所以我们目前必须将表达式编译为 C++ 表达式,并且正如您所猜测的,您不能在 C++ 表达式中使用“类”。在某些时候,我们必须教 clang 如何做“带引用的 C”,然后我们才能编译和执行真正的 C 表达式。
但是,如果您有“类”的调试信息,您可以使用“框架变量”命令打印变量的值,即:
(lldb) frame variable class
“帧变量”命令不使用表达式解析器,它直接进入调试信息,提取变量的类型和位置,并直接打印出来。所以它不受这个限制。如果“类”是全局变量,而不是局部帧,请改用target variable。
frame variable 确实支持一组有限的“类表达式”功能,您可以说:
(lldb) frame variable class.member
或
(lldb) frame variable *class
但您不能使用它来调用函数或将变量传递给函数调用。
如果你需要这样做,你可以运行命令:
(lldb) frame variable -L class
这将打印变量的位置。通常这是一些地址,在这种情况下你可以使用
(TypeOfClass *) <Address From Frame Variable>
在你的表达中代替“类”。如果该位置是一个寄存器,则在表达式中适当地使用“$”。如果您要在多个表达式中使用该变量,请记住您可以这样做:
(lldb) expr TypeOfClass *$class = (TypeOfClass *) <Address From Frame Variable>
然后只需在后续表达式中使用 $class 即可。如果你有超强的动力,你甚至可以编写一个 Python 命令来自动执行这些步骤......