Value eval(Value arg, Table env) {
if (arg.tag == ConsCell) {
Value operator = car(arg);
Value operands = cdr(arg); // <- debugger stopped here
Run Code Online (Sandbox Code Playgroud)
如果我打印的说法arg有p arg,我得到:
(lldb) p arg
(Value) $0 = {
data = {
number = 1068272
list = 0x0000000100104cf0
symbol = 0x0000000100104cf0 "?L\x10"
}
tag = ConsCell
}
Run Code Online (Sandbox Code Playgroud)
但如果p operator,我得到:
(lldb) p operator
error: expected a type
error: 1 errors parsing expression
Run Code Online (Sandbox Code Playgroud)
但是,使用frame variable operator作品:
(lldb) frame variable operator
(Value) operator = {
data = {
number = 1068208
list = 0x0000000100104cb0
symbol = 0x0000000100104cb0 "\x10L\x10"
}
tag = ConsCell
}
Run Code Online (Sandbox Code Playgroud)
我用的时候出了什么问题p operator?
lldb在C++和Objective-C的混合中评估表达式. operator,变量的名称,是C++中的保留关键字.当您使用p命令(命令的别名expression)时,lldb将您的表达式传递给clang以进行解析并在C++/Objective-C中进行求值(或者,如果您正在调试Swift方法,则在Swift中进行解析和求值).即使您的程序是用直接C编写的,您的表达式也会被评估为C++表达式,而这不是有效的C++表达式.
frame variable(fr v简称)不会通过编译器进行评估,它会尝试对提供的变量路径进行简单的解析.它可以执行简单的解引用和跟随指针,但它不能转换值.