LLDB 打印一个名为 class 的变量

LLDB print a variable named class

我有一个 C 程序,其中使用了一个名为 class 的变量。

我正在尝试使用 LLDB 对其进行调试,但我遇到了以下问题:

(lldb) print class
error: warning: declaration does not declare anything
error: declaration of anonymous class must be a definition
error: 1 errors parsing expression

我认为出现此问题是因为 class 是 C++ 中的保留关键字,LLDB 将传递给 print 的代码解释为 C++。还有办法打印我的变量的内容吗?

(请不要建议我重命名变量,如果可能的话,我会自己想出这个)

问题是 lldb 表达式解析器使用 C++ 引用来实现从我们 运行 的表达式中查找和提取结果的工作。所以我们目前必须将表达式编译为 C++ 表达式,正如您所猜测的,您不能在 C++ 表达式中使用 "class"。在某些时候,我们必须教 clang 如何做 "C with references" 然后我们将能够编译和执行真正的 C 表达式。

但是,如果您有 "class" 的调试信息,您可以使用 "frame variable" 命令打印变量的值,即:

(lldb) frame variable class

"frame variable"命令不使用表达式解析器,它直接进入调试信息,提取变量的类型和位置,并直接打印。所以它不受此限制。如果 "class" 是全局变量,而不是局部帧,请改用 target variable

frame variable 确实支持一组有限的 "expression-like" 功能,您可以说:

(lldb) frame variable class.member

(lldb) frame variable *class

但您不能使用它来调用函数或将变量传递给函数调用。

如果您需要这样做,您可以 运行 命令:

(lldb) frame variable -L class

这将打印变量的位置。通常这是一些地址,在这种情况下你可以使用

 (TypeOfClass *) <Address From Frame Variable>

在你的表达式中代替 "class"。如果该位置原来是一个寄存器,则在您的表达式中适当地使用“$”。如果您打算在多个表达式中使用该变量,请记住您可以这样做:

(lldb) expr TypeOfClass *$class = (TypeOfClass *) <Address From Frame Variable>

然后在后续表达式中使用 $class。如果你有超级动力,你甚至可以写一个 Python 命令来自动执行这些步骤...