如何在xcode中启用_LIBCPP_DEBUG_LEVEL> = 2

时间:2015-02-16 15:35:41

标签: c++ xcode clang

在阅读std库实现时,我可以看到#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

我是否还缺少其他标准库使用更高调试级别的内容?

2 个答案:

答案 0 :(得分:2)

根据libc++ documentation

  

调试模式目前无法正常运行。定义_LIBCPP_DEBUG将导致相当讨厌的编译错误。

所以这可能就是其中的来源。

答案 1 :(得分:0)

Baum mit Augen的回答是,_LIBCPP_DEBUG_LEVEL >= 2用于较低级别迭代器调试的标准库代码基本上是不可用的,现成的Xcode 11.6似乎仍然如此。但是,如果您需要更多工作或只是想了解更多细节,请继续阅读...

启用_LIBCPP_DEBUG_LEVEL代码将启用LLVM's Debug Mode。根据该文档,通过将_LIBCPP_DEBUG的值定义为0(“启用大部分libc ++的断言”)或1(“启用'iterator调试”,其提供有关以下内容的其他断言)来启用此调试模式:程序使用的迭代器的有效性”。

在XCode 11.6中,我发现将_LIBCPP_DEBUG=0添加到项目的Debug Preprocessor Macros设置中,进行编译和链接,并确实添加了其他检查-至少检查对std::vector元素的超出范围的引用通过其[]运算符。通过设置_LIBCPP_DEBUG_LEVEL >= 2来启用_LIBCPP_DEBUG=1代码。但是,仅此一个就无法完全链接,因为未找到所有必需的符号。具体来说,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工具链支持。我在Xcode的/usr/local/Cellar/llvm/10.0.1/Toolchains/LLVM10.0.1.xctoolchain目录中添加了一个指向/Applications/Xcode.app/Contents/Developer/Toolchains的符号链接。我是在Xcode运行时完成此操作的,它立即看到了新的工具链,但我不得不重新启动Xcode才能对其进行编译。
  3. 在Xcode的“ Xcode”->“工具链”子菜单下,选择新的工具链。我的设置显示“ 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. 具有到新工具链的包含目录的路径,将覆盖普通标准库的包含目录。我尚未确认这是否必要,但是通过向我的库和可执行目标的OTHER_CPLUSPLUSFLAGS声明中添加了-nostdinc++ -I/usr/local/Cellar/llvm/10.0.1/Toolchains/LLVM10.0.1.xctoolchain/usr/include/c++/v1的值来做到这一点。在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?