【问题标题】:How to enable _LIBCPP_DEBUG_LEVEL>=2 in xcode如何在 xcode 中启用 _LIBCPP_DEBUG_LEVEL>=2
【发布时间】:2015-02-16 15:35:40
【问题描述】:

在阅读标准库实现时,我可以看到#if _LIBCPP_DEBUG_LEVEL >= 2 条件启用的许多检查。我尝试在 xcode 预处理器选项中添加 _LIBCPP_DEBUG_LEVEL = 3,但 <iterator> 不再编译:

#if _LIBCPP_DEBUG_LEVEL >= 2
__get_db()->__insert_i(this);   <----- the error is on this line
#endif

还有什么我在这里缺少的东西可以为标准库使用更高的调试级别吗?

【问题讨论】:

  • 你得到什么错误?
  • 似乎 libc++“调试模式”在 XCode 11.1 中仍然不完全可用。我能够获得一个库来编译和链接文件中的#define _LIBCPP_DEBUG_LEVEL 2#define _LIBCPP_CONSTEXPR_IF_NODEBUG(不同文件中的代码之间的行为不一致)但是一旦我在main.cpp 或通过XCode Preprocessor Macros 尝试设置,我得到未定义的符号链接错误,例如“std::__1::__libcpp_db::__dereferenceable(void const*) const”。链接错误是您看到的还是没有使用到那么远?
  • 现在尝试了 XCode 11.6,但仍然有未定义的符号。发现虽然单独定义_LIBCPP_DEBUG=1 使得__config 包含文件定义_LIBCPP_DEBUG_LEVEL=2 和设置_LIBCPP_CONSTEXPR_IF_NODEBUG= 不再是必要的。关于如何启用调试模式,这与当前的 LLVM Debug Mode 文档更一致。具体来说,std::__1::__libcpp_db::__insert_c(void*, std::__1::__c_node* (*)(void*, void*, std::__1::__c_node*)) 符号现在是未定义的,如果不是更多的话。
  • 找到一个相关的stackoverflow问题:stackoverflow.com/questions/15899937/…

标签: c++ xcode clang


【解决方案1】:

根据libc++ documentation

调试模式目前不起作用。定义 _LIBCPP_DEBUG 会导致相当严重的编译错误。

所以这可能是它的来源。

【讨论】:

【解决方案2】:

Baum mit Augen 的回答是,_LIBCPP_DEBUG_LEVEL &gt;= 2 用于较低级别迭代器调试的标准库代码基本上无法使用,开箱即用的 Xcode 11.6 似乎仍然如此。但是,如果您需要额外的工作或只是想了解更多细节,请继续阅读...

启用_LIBCPP_DEBUG_LEVEL 代码就是启用LLVM's Debug Mode。根据该文档,启用此调试模式是通过将_LIBCPP_DEBUG 定义为值 0(“启用大多数 libc++ 的断言”)或 1(“启用'迭代器调试',它提供关于程序使用的迭代器”)。

在 XCode 11.6 中,我发现将 _LIBCPP_DEBUG=0 添加到项目的调试预处理器宏设置、编译和链接,并且确实添加了额外的检查 - 至少通过其 @987654329 检查对 std::vector 元素的超出范围引用@ 操作员。通过设置_LIBCPP_DEBUG=1 来启用_LIBCPP_DEBUG_LEVEL &gt;= 2 代码。然而,仅此一项并不能完全链接,因为没有找到所有必要的符号。具体来说,std::__1::__libcpp_db::__insert_c(void*, std::__1::__c_node* (*)(void*, void*, std::__1::__c_node*)) 符号被报告为未定义,可能还有其他符号。据推测,XCode 11.6 并没有将它内置到它提供的标准 C++ 库中。如果有人更了解或可以证实这一点,我将不胜感激。

通过以下额外工作,我已经能够启用 libc++ 的断言以及额外的迭代器调试功能:

  1. 在不干扰 Xcode 包含的 LLVM 包的地方安装最近的 LLVM 包。我使用 Homebrew 安装了 LLVM 10.0.1,然后我可以在 /usr/local/Cellar/llvm/10.0.1 下访问它。
  2. 让 Xcode 识别这个新的 LLVM 包提供的 Xcode 工具链支持。我将/usr/local/Cellar/llvm/10.0.1/Toolchains/LLVM10.0.1.xctoolchain 的符号链接添加到Xcode 的/Applications/Xcode.app/Contents/Developer/Toolchains 目录中。我在 Xcode 运行时这样做了,它立即看到了新的工具链,但我必须重新启动 Xcode 才能让它编译。
  3. 在 Xcode 的“Xcode”->“Toolchains”子菜单下,选择新的工具链。我的设置显示“Xcode 11.7”和“org.llvm.10.0.1”,我选择后者来完成此操作。
  4. 将新工具链的usr/lib 目录的路径添加到生成的可执行目标的LIBRARY_SEARCH_PATHS 声明中。我通过将/usr/local/Cellar/llvm/10.0.1/Toolchains/LLVM10.0.1.xctoolchain/usr/lib 添加到项目的可执行目标“库搜索路径”“调试”设置来做到这一点。
  5. 让新工具链的包含目录的路径覆盖普通标准库的包含目录。我还没有确认这是必要的,但是通过将-nostdinc++ -I/usr/local/Cellar/llvm/10.0.1/Toolchains/LLVM10.0.1.xctoolchain/usr/include/c++/v1 的值添加到我的库和可执行目标的OTHER_CPLUSPLUSFLAGS 声明来做到这一点。在 Xcode 中,我通过设置“Other C++ Flags”设置为感兴趣的目标包含这个值来实现这一点。我怀疑在项目级别进行此更改可能比目标级别更安全。
  6. COMPILER_INDEX_STORE_ENABLE 声明设置为NO。这防止了从一开始就停止构建的“未知参数:'-index-store-path'”错误。为此,我使用了 Xcode 的“启用索引时构建功能”设置并将其设置为“否”。
  7. _LIBCPP_DEBUG=1 添加到项目的GCC_PREPROCESSOR_DEFINITIONS 声明中。通过将其添加到 Xcode 的“预处理器宏”“调试”设置中来做到这一点。

有关此问题的相关问答,请参阅Is it possible to enable _LIBCPP_DEBUG2 in the current Xcode 4.6.1 toolchain on Mountain Lion?

【讨论】:

    猜你喜欢
    • 2011-07-20
    • 1970-01-01
    • 2011-11-11
    • 2015-09-21
    • 2015-11-16
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    相关资源
    最近更新 更多