Cocoa 如何使用gdb打印和使用常量(通过Xcode)?
我正在使用xcode gdb调试Cocoa应用程序。我正处于一个断点,我想查看一些Cocoa常量(即NSControlKeyMask)的值,并对当前stackframe中的值进行一些测试。具体地说,我在-(void)keyDown:(NSEvent*)e中,并且在gdb提示符上设置了$mf=(int)[e modifierFlags]。现在我想做p$mf&NSControlKeyMask,gdb告诉我“当前上下文中没有符号”NSControlKeyMask“ - (void) keyDown:(NSEvent *) e set $mf = (int)[e modifierFlags] p $mf & NSControlKeyMask 更新:Cocoa 如何使用gdb打印和使用常量(通过Xcode)?,cocoa,xcode,debugging,gdb,Cocoa,Xcode,Debugging,Gdb,我正在使用xcode gdb调试Cocoa应用程序。我正处于一个断点,我想查看一些Cocoa常量(即NSControlKeyMask)的值,并对当前stackframe中的值进行一些测试。具体地说,我在-(void)keyDown:(NSEvent*)e中,并且在gdb提示符上设置了$mf=(int)[e modifierFlags]。现在我想做p$mf&NSControlKeyMask,gdb告诉我“当前上下文中没有符号”NSControlKeyMask“ - (void) keyDown:(
Xcode具有“”功能。因此,我将Dan M.和n8gray解决方案与此功能结合使用,这样我就不必为每个常量创建代理。NSControlKeyMask很可能是一个宏,调试器不可见。您需要查看相应的.h文件。将光标放在编辑器中的文本NSControlKeyMask上,然后尝试command+双击跳转到其定义。如果使用gcc编译,则可以使用
-g3
开关获取最高级别的调试信息。引述:
-格雷维尔
请求调试信息,并使用级别指定信息量。默认级别为2。
级别0完全不生成调试信息。因此,-g0否定-g。
级别1生成的信息最少,足以在零件中进行回溯
您不打算调试的程序的。这包括描述
函数和外部变量,但没有关于局部变量的信息
变量和无行号。
级别3包括额外信息,例如所有宏定义
在节目中。某些调试器在使用时支持宏扩展
-g3。
因此,如果您使用
-g3
编译,您应该能够在gdb中展开常量和宏。如果没有使用给定类型实际实例化变量,则相应符号的调试信息不会最终由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/xbaz”时,你会得到“0x2”作为答案,我想这正是你在你的问题中想要的
我已经研究过了,问题是NSEvent.h头文件没有给包含
NSControlKeyMask
的枚举命名——它是一个匿名枚举。因此,无法创建该类型的变量(dummy或其他)。因此,我看不到任何让编译器生成该类型调试信息的方法。我认为您必须依赖头文件中的NSControlKeyMask
定义。正如Dan M.发现的,您可能无法以简单的方式实现这一点。相反,您可以在其中一个文件中放入类似的内容:
int myNSControlKeyMask = NSControlKeyMask;
int myNSOptionKeyMask = NSOptionKeyMask;
...
那么,至少可以在GDB中使用符号名称,而不必在.h文件中查找相应的值。
< P>我似乎在一组C++代码中得到同样的问题,这是在iPhone应用程序中从Obj-C调用的。它给我的是当前上下文中没有符号“a”。
错误,其中a是int。我尝试了-g3编译器标志,但没有成功。我发现很难相信gdb不知道int.sdk3.0的类型,但是再一次,当它可以在程序中找到变量时,gdb打印了完全错误的值。嗯,gdb应该理解枚举。正如Nathan所建议的,您可能需要使用-g3进行编译。我找不到在哪里可以为我的xcode项目添加额外的gcc参数。有一个名为“调试符号级别”的xcode项目设置,它被设置为“所有符号”
int myNSControlKeyMask = NSControlKeyMask;
int myNSOptionKeyMask = NSOptionKeyMask;
...