【问题标题】:LLDB print a variable named classLLDB 打印一个名为 class 的变量
【发布时间】:2015-05-15 04:22:46
【问题描述】:

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

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

【问题讨论】:

    标签: c lldb


    【解决方案1】:

    问题在于 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 命令来自动执行这些步骤......

    【讨论】:

      猜你喜欢
      • 2016-07-06
      • 2016-07-10
      • 2015-09-28
      • 2015-10-03
      • 2014-08-06
      • 2019-06-15
      • 1970-01-01
      • 2013-01-12
      • 2012-11-29
      相关资源
      最近更新 更多