LLDB打印一个名为class的变量

时间:2015-03-12 20:20:28

标签: c lldb

我有一个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 ++。还有办法打印变量的内容吗?

(请不要告诉我重命名变量,如果有可能的话,我会自己想出来)

1 个答案:

答案 0 :(得分:8)

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

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

(lldb) frame variable class

“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>

在你的表达中代替“class”。如果该位置原来是一个寄存器,那么在表达式中使用“$”。如果要在多个表达式中使用变量,请记住:

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

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