使用ccache的Xcode Address Sanitizer

时间:2017-05-10 20:05:29

标签: xcode xcode8 address-sanitizer ccache

我正在尝试在Xcode中使用Address Sanitizer,但我也在使用ccache来加速我的构建。为此,我在Xcode项目级别设置了CC标志,指向我在~/projects/support/cmake/ccache-clang存储的脚本。脚本读取

#!/bin/sh
if type -p /usr/local/bin/ccache >/dev/null 2>&1; then
  export CCACHE_CPP2=true
  exec /usr/local/bin/ccache "${DEVELOPER_DIR}/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang" "$@"
else
  exec "${DEVELOPER_DIR}/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang" "$@"
fi

因此可以达到预期的效果(如果安装在开发人员的系统上,则使用ccache)。这很有效。

现在,当我们打开给定方案的Address Sanitizer时问题就出现了。构建成功完成,但是当我们尝试运行时,我们终于看到了这个错误:

Error: Check dependencies

Could not determine version of clang to find its Address Sanitizer library: ~/projects/support/cmake/ccache-clang

也许这是由于Xcode中的一些hacky实现,它试图解析编译器的路径以确定版本?

想知道如何修改我的脚本以允许Address Sanitizer工作。目前的解决方法是在我们需要进行消毒剂工作时删除被覆盖的CC标志。

使用Xcode 8.3.1

1 个答案:

答案 0 :(得分:1)

直接链接Asan库,而不是选中方案中的框。

链接器编译器标志应包含以下内容。

-fsanitize=address -fno-omit-frame-pointer

如果找不到该库,请找到通常在其中的asan动态库的路径

${CMAKE_LINKER}/../../lib/clang/version/lib/darwin/libclang_rt.asan_osx_dynamic.dylib

并将其添加到链接器标志。