我有一个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
Run Code Online (Sandbox Code Playgroud)
我相信会出现这个问题,因为classC++中的保留关键字和LLDB解释传递给printC++的代码.还有办法打印变量的内容吗?
(请不要建议我重命名变量,如果可能的话,我会自己想出这个)
问题是lldb表达式解析器使用C++引用来实现从我们运行的表达式中查找和提取结果的工作.所以我们当前必须将表达式编译为C++表达式,正如您所猜测的那样,您不能在C++表达式中使用"class".在某些时候,我们必须教clang如何做"C with references"然后我们将能够编译和执行真正的C表达式.
但是,如果您有"类"的调试信息,则可以使用"frame variable"命令打印变量的值,即:
(lldb) frame variable class
Run Code Online (Sandbox Code Playgroud)
"frame variable"命令不使用表达式解析器,它直接转到调试信息,提取变量的类型和位置,并直接打印.所以它没有受到这种限制.如果"class"是全局变量,而不是本地框架,请target variable改用.
frame variable 确实支持一组有限的"表达式"功能,你可以说:
(lldb) frame variable class.member
Run Code Online (Sandbox Code Playgroud)
要么
(lldb) frame variable *class
Run Code Online (Sandbox Code Playgroud)
但你不能用它来调用函数或将变量传递给函数调用.
如果需要,可以运行命令:
(lldb) frame variable -L class
Run Code Online (Sandbox Code Playgroud)
这将打印变量的位置.通常这是一些地址,在这种情况下你可以使用
(TypeOfClass *) <Address From Frame Variable>
Run Code Online (Sandbox Code Playgroud)
在你的表达中代替"阶级".如果该位置原来是一个寄存器,那么在表达式中使用"$".如果您打算在多个表达式中使用该变量,请记住您可以:
(lldb) expr TypeOfClass *$class = (TypeOfClass *) <Address From Frame Variable>
Run Code Online (Sandbox Code Playgroud)
然后在后续表达式中使用$ class.如果你有超级动力,你甚至可以编写一个自动执行这些步骤的Python命令......