如何使用gdb打印和使用常量(通过Xcode)?

phi*_*phi 5 debugging xcode cocoa gdb

我正在使用xcode-gdb调试Cocoa应用程序.我处于断点,我希望查看一些Cocoa常量(即NSControlKeyMask)的值,并使用当前堆栈帧中的值进行一些测试.具体来说,我在

- (void) keyDown:(NSEvent *) e 
,我已经完成了
set $mf = (int)[e modifierFlags]
在gdb提示符上.现在我想做
p $mf & NSControlKeyMask
并且gdb告诉我'当前上下文中没有符号"NSControlKeyMask".

更新:
Xcode具有" 修复并继续文本 "功能.所以我使用了Dan M.和n8gray解决方案,因此我不需要对每个常量进行代理.

Dan*_*ing 6

如果没有实际使用给定类型实例化变量,则相应符号的调试信息不​​会被gcc生成.然后,如果你问gdb这种类型,它不知道你在说什么,因为没有该类型的调试信息,它会给你"当前上下文中没有符号"错误.

解决此问题的方法通常是在代码中的某处显式添加有问题类型的虚拟变量.这是一个简单的例子,你可以测试看看我在说什么:

enum an_enum_type {
  foo,
  bar,
  baz
};

int main (int argc, char *argv [])
{
  return baz;
}
Run Code Online (Sandbox Code Playgroud)

将该程序保存到名为test.cpp的文件中,并使用以下命令对其进行编译:

g++ -o test -g -O0 test.cpp
Run Code Online (Sandbox Code Playgroud)

然后在gdb下运行它并输入"p/x baz".您将获得"当前上下文中没有符号baz"错误.

现在尝试使用这个已添加枚举类型的虚拟变量的修改版本:

enum an_enum_type {
  foo,
  bar,
  baz
};

an_enum_type dummy;

int main (int argc, char *argv [])
{
  return baz;
}
Run Code Online (Sandbox Code Playgroud)

使用与以前相同的命令编译并在gdb下运行.这次当你输入"p/x baz"时,你会得到"0x2"作为答案,我认为这是你在问题中拍摄的内容.

我调查了它,问题是NSEvent.h头文件没有为包含的枚举命名NSControlKeyMask- 它是一个匿名枚举.因此无法创建该类型的变量(虚拟或其他).所以,我没有看到让编译器生成该类型的调试信息的任何方法.我认为你只需要依赖NSControlKeyMask头文件的定义.