在阅读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
我是否还缺少其他标准库使用更高调试级别的内容?
答案 0 :(得分:2)
答案 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 ++的断言以及其他迭代器调试功能:
/usr/local/Cellar/llvm/10.0.1
下访问它。/usr/local/Cellar/llvm/10.0.1/Toolchains/LLVM10.0.1.xctoolchain
目录中添加了一个指向/Applications/Xcode.app/Contents/Developer/Toolchains
的符号链接。我是在Xcode运行时完成此操作的,它立即看到了新的工具链,但我不得不重新启动Xcode才能对其进行编译。usr/lib
目录的路径添加到LIBRARY_SEARCH_PATHS
声明中,以生成可执行的目标。为此,我向项目的可执行目标“库搜索路径”“调试”设置中添加了/usr/local/Cellar/llvm/10.0.1/Toolchains/LLVM10.0.1.xctoolchain/usr/lib
。OTHER_CPLUSPLUSFLAGS
声明中添加了-nostdinc++ -I/usr/local/Cellar/llvm/10.0.1/Toolchains/LLVM10.0.1.xctoolchain/usr/include/c++/v1
的值来做到这一点。在Xcode中,我通过设置“ Other C ++ Flags”设置使其包含目标目标的此值来实现这一点。我怀疑在项目级别进行此更改可能比目标级别更安全。COMPILER_INDEX_STORE_ENABLE
声明设置为NO
。这样可以防止从一开始就停止生成的“未知参数:'-index-store-path'”错误。我使用了Xcode的“启用建立索引功能”设置,并将其设置为“否”。_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?。