【问题标题】:print in Xcode GDB with C++ doesn't print correct values使用 C++ 在 Xcode GDB 中打印不打印正确的值
【发布时间】:2009-09-01 13:16:54
【问题描述】:

我正在编写/调试一个使用大部分 C++ 进行图像处理的 iPhone 项目。我在 Xcode 下使用 gdb 时遇到问题,因为每当我打印值时,它们与真实值完全不符(比较
cout << "width" << width << endl; 打印出 320,如果我在gdb,我得到像 805300460 这样的值)

我猜这是 gdb 的问题,而不是程序的问题,因为我认为我没有覆盖内存并且打印到 stdout 的值似乎是正确的。语言自动设置为 C++。

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

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

【问题讨论】:

    标签: c++ xcode gdb printing


    【解决方案1】:

    简要介绍一下,您使用了哪些优化?如果您正在使用一些,则该值可能会保存在寄存器中而不是当时被写入内存,因此您将获得内存中曾经存在的任何值。在这种情况下,您将通过 iostream 获得正确答案,因为编译器必须使可观察的行为与语言所说的相匹配,但 gdb 会在幕后查看。

    【讨论】:

    • 在项目 > 编辑项目设置 > 构建 > 优化级别下,它被设置为“最快,最小”[-Os]。我将其更改为无 [-O0],但仍然没有运气。不过感谢您的回答!
    【解决方案2】:

    在 gdb 中尝试:

    p /d width
    

    也许编码不同。

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

    【讨论】:

    • 也试过了,但没有运气:(。谢谢你的建议!如果你能想到什么,请告诉我!
    • 在 C++ 中试试这个: int a 12345; .. cout
    • 它返回不同的值。 int a = 1234; cout
    • 另外两个有趣的事实:openradar.appspot.com/7017295 似乎其他人也有类似的问题,尽管这只是在构建程序的修改版本时出现的问题。我尝试在模拟器上运行修改后的版本,它运行良好,所以它似乎是一个 iphone 错误。这令人沮丧...
    【解决方案3】:

    我在使用以下 GDB 版本时遇到了类似的问题:

    i686-apple-darwin9-g++-4.0.1 (GCC) 4.0.1(Apple Inc. build 5493) 版权所有 (C) 2005 Free Software Foundation, Inc.

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

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

    这可能是您所经历的,如果您打印的值也将用作函数的返回值。

    就我而言,该程序是一个正确运行的程序。该问题完全与即使将构建设置为“零优化”的优化也有影响,并且还与二进制文件中不正确的调试信息有关。但程序本身运行良好。

    【讨论】:

      猜你喜欢
      • 2012-01-12
      • 1970-01-01
      • 2011-09-05
      • 1970-01-01
      • 1970-01-01
      • 2018-06-25
      • 1970-01-01
      • 2019-05-17
      • 1970-01-01
      相关资源
      最近更新 更多