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 命令来自动执行这些步骤...
我有一个 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 命令来自动执行这些步骤...