我正在使用 xcode-gdb 调试 Cocoa 应用程序。我正处于断点,我想查看一些 Cocoa 常量(即 NSControlKeyMask)的值,并对当前堆栈帧中的值进行一些测试。具体来说,我在
- (void) keyDown:(NSEvent *) e,我已经做了
set $mf = (int)[e modifierFlags]在 gdb 提示符下。现在我想做
p $mf & NSControlKeyMaskgdb 告诉我“当前上下文中没有符号“NSControlKeyMask”。”
更新:
Xcode 具有“Fix and Continue text ”功能。因此我使用了 Dan M. 和 n8gray 解决方案来实现此功能,这样我就不必为每个常量创建代理。
最佳答案
如果没有使用给定类型实际实例化变量,则 gcc 最终不会生成相应符号的调试信息。然后,如果你向 gdb 询问这样的类型,它不知道你在说什么,因为没有该类型的调试信息,并且它会给你“当前上下文中没有符号”错误。
此问题的解决方法通常是在代码中的某处显式添加相关类型的虚拟变量。这是一个简单的示例,您可以测试一下以了解我在说什么:
enum an_enum_type {
foo,
bar,
baz
};
int main (int argc, char *argv [])
{
return baz;
}
将该程序保存到名为 test.cpp 的文件中并使用以下命令进行编译:
g++ -o test -g -O0 test.cpp
然后在 gdb 下运行它并输入“p/x baz”。您将收到“当前上下文中没有符号 baz”错误。
现在尝试使用添加了枚举类型的虚拟变量的修改版本:
enum an_enum_type {
foo,
bar,
baz
};
an_enum_type dummy;
int main (int argc, char *argv [])
{
return baz;
}
使用与之前相同的命令编译并在gdb下运行。这次,当您输入“p/x baz”时,您将得到“0x2”作为答案,我认为这就是您在问题中所要表达的目的。
我已经研究过它,问题是 NSEvent.h 头文件没有为包含 NSControlKeyMask 的枚举提供名称 - 它是一个匿名枚举。因此无法创建该类型的变量(虚拟变量或其他变量)。因此,我没有看到任何方法可以让编译器生成该类型的调试信息。我认为您只需要依赖头文件中 NSControlKeyMask
的定义即可。
关于cocoa - 如何通过 gdb 打印和使用常量(通过 Xcode)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/864729/