【问题标题】:How to inspect all local variables using the XCode 6.1 C++ debug mode如何使用 XCode 6.1 C++ 调试模式检查所有局部变量
【发布时间】:2015-02-27 05:26:39
【问题描述】:

我正在使用 XCode 6.1 调试我的 C++ 代码,我发现调试区域中没有显示一些局部变量,即使我使用了“所有变量”设置。

我想知道如何将这些变量添加到调试列表中?

或者如何在 LLDB 上打印出那些缺失的变量?我试过po test,但它说:

error: use of undeclared identifier 'test'

我最好切换到 C++ 的 Eclipse IDE 吗?

顺便说一句,我正在使用 CMake 生成 XCode 项目,所以也许我在调试模式下遗漏了一些东西? 我记得如果使用gcc,我需要-g选项,我使用CLang时是否需要它?

【问题讨论】:

  • 你用什么语言编码?
  • 我用的是c++语言
  • 从未做过,但我听说调试器对 c++ 的支持很弱。
  • 调试器错过了一些变量,我找不到如何将它们添加到手表,这很奇怪
  • 您是在调试版本还是调试版本?局部变量在发布版本中不可用的情况并不少见。

标签: c++ xcode macos cmake lldb


【解决方案1】:

从代码补全和高亮的角度来看,Xcode 对 c++ 编码的效果相当好,在我看来仅次于 Visual Studio,但通过 Apple lldb 进行调试将非常成功。模板将是最糟糕的,您通常会收到有关无法实现目标或其他过时的错误,与调试器相关的令人愤怒的错误对您所要求的内容感到困惑或无法找到函数。

不幸的是,好几个版本都采用了这种方式,而且似乎 c++ 排在了 Objective-c 的第二位,而且它可能也会落后于 swift;它可能不会被修复。

您可能也不会在 Eclipse 上度过更好的时光,而且您将在代码完成、分析、静态分析等方面做出很多牺牲。

最好的建议是确保您处于调试模式,这样事情就不会被优化掉。如果您想检查一个表达式,尤其是一个涉及模板的表达式,请将其放在一个局部变量中,优化器将在发布版本中完成其工作,因此不会出现性能问题。现在是 21 世纪,但不幸的是,有时你只需要使用 std::cerr :(

【讨论】:

  • 我没有使用模板;优化级别为O0
  • 'po' 好像是用来打印 ObjectiveC 的,试试“p test”吧。
  • 使用 p 时结果相同
【解决方案2】:

如果您收到“未定义标识符”错误,可能是因为编译器没有为变量发出调试信息。即使在 -O0 时,编译器也不会为未使用的变量发出调试信息。所以,如果你只有:

int test = 0;

然后您从不提及测试(例如,将其传递给函数或为其分配某些内容),编译器很可能不会为它发出调试信息。 clang 和 gcc 都是如此。

注意,lldb 有两种查看局部变量的方法。 “p”命令运行完整的表达式解析器,并且可以做很多花哨的事情(访问在当前范围内不可见的变量和类型等)但在某些情况下,它可能会被忽略。

另一个命令是“帧变量”,它只打印当前范围内的所有局部变量。您也可以执行“框架变量测试”来查看本地命名测试。这个命令只是直接从调试信息中提取本地人,所以虽然它不能用于调用函数等,但它是非常防弹的。

尝试一下,如果测试显示在“框架变量”输出中,但“p”没有显示,那么如果可以,请将您的示例中的错误提交到 bugreporter.apple.com,我们'我很想看看。

如果它也没有出现在“帧变量”中,那么这可能是编译器生成的调试信息的问题。如果你有一些你正在使用的本地,并且你在 -O0 编译,那么它应该显示在调试信息中。如果不是这样,并且您有一个示例表明您可以提供此功能,那么如果您可以提交错误,那就太好了。

【讨论】:

    猜你喜欢
    • 2021-02-24
    • 2019-06-13
    • 2012-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多