2009-09-01 46 views
0

我正在编写/调试使用大量C++进行图像处理的iPhone项目。当我在Xcode下使用gdb时,我遇到了麻烦,因为每当我打印值时,它们都完全不符合真正的值(比较
cout << "width" << width << endl;打印出320,如果我在gdb中做了
print width
,我得到值像805300460)使用C++在Xcode GDB中打印不能打印正确的值

我猜测这是gdb的问题,而不是程序,因为我不认为我覆盖内存和打印到标准输出的值似乎是正确的。该语言被自动设置为C++。

看着这个Apple GDB doc好像添加这个编译器标志可能有助于-gdwarf-2?不知道在哪里做。

有人遇到这个问题?有什么想法?

回答

1

在快速刺中,您使用了哪些优化?如果你使用的是一些,那么值就会被保存在一个寄存器中,而不是被写入内存,所以你会得到任何内存中的值。在这种情况下,你会通过iostream得到正确的答案,因为编译器必须使可观察的行为与语言所说的内容相匹配,但是gdb看起来在幕后。

+0

在项目>编辑项目设置>构建>优化级别下,它被设置为“最快,最小”[-Os]。我将它改为无[-O0],仍然没有运气。尽管谢谢你的回答! – Andres 2009-09-01 15:05:43

1

在gdb的尝试:

p /d width 

也许编码是不同的。

我不认为“矮人”params会帮助。 Dwarf params在编译过程中使用源代码描述中间代码。 基本上他们试图在编译阶段保留源代码。 在gdb中,它允许您将源代码中的行号与二进制语句相匹配。 这个问题不应该与变量有关。

+0

也尝试过,但没有运气:(。谢谢你的建议!如果你能想到其他的东西,请告诉我! – Andres 2009-09-01 15:06:36

+0

试一试C++: int a 12345; ..cout << hex << a << endl; 而这在gdb: p/x a 它应该返回相同的值。 – name 2009-09-01 16:24:49

+0

它返回不同的值。 int a = 1234; cout << hex << a << endl;打印出4d2 p/x a打印出0x0(不是很好的符号)。 我试过未经修改的开源项目,它似乎工作正常,所以它似乎是某种设置。有没有办法在Xcode中重置gdb设置? – Andres 2009-09-01 21:57:55

0

在使用下列GDB版本我有一个类似的问题:

的i686-苹果darwin9-G ++ - 4.0.1(GCC)4.0.1(苹果公司建立5493) 版权所有( C)2005自由软件基金会,公司

我了解到,这个问题可能这个GCC编译器的问题是由于:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44731

这可能是您所遇到的,如果您打印的值也被用作函数的返回值。

在我的情况下,该程序是一个正确运行的程序。该问题完全与优化有关,即使构建集为“零优化”,也与二进制文件中不正确的调试信息有关。但程序本身运行良好。