【发布时间】:2016-10-30 23:46:29
【问题描述】:
在 Ubuntu 14.10 上,llvm-symbolizer 程序安装为 /usr/bin/llvm-symbolizer-3.5。通常,地址清理程序希望在PATH 中找到一个名为llvm-symbolizer 的二进制文件。但是,作为一种解决方法,可以显式设置ASAN_SYMBOLIZER_PATH。因此,在环境中设置 ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer-3.5 将使地址净化器检测程序打印符号化错误。
在 Ubuntu 16.04 上,llvm-symbolizer 程序再次以版本后缀安装,现在为 /usr/bin/llvm-symbolizer-3.8。但是,ASAN_SYMBOLIZER_PATH 设置似乎不再起作用。当 ASAN 检测到错误时,在环境中运行设置了 ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer-3.8 的 ASAN 检测程序会生成以下错误:
==18718==ERROR: External symbolizer path is set to '/usr/bin/llvm-symbolizer-3.8' which isn't a known symbolizer. Please set the path to the llvm-symbolizer binary or other known tool.
有谁知道为什么这种行为会改变,或者如何恢复旧的行为?这似乎是不合理的限制。我指向 ASAN 的符号程序绝对是一个已知的符号程序,它恰好在末尾有一个 Ubuntu 强制版本标记。
请注意,调整 PATH 在这里没有帮助,因为 Ubuntu 不会提供没有版本修饰的 llvm-symbolizer 二进制文件。
【问题讨论】:
-
对于遇到此问题的任何其他人,这似乎是 [compiler_rt 中的此更改][1] 的结果。我已经对评论进行了 ping 操作,试图确定这种行为变化是否是有意的,或者这是否是一种回归 [1]:reviews.llvm.org/D8285
-
解决此问题的最简单方法:
sudo ln -s /usr/bin/llvm-symbolizer-3.8 /usr/bin/llvm-symbolizer -
@Eraden 当然,这在我的开发盒上运行良好,但这是针对我无法更改 /usr/bin 的 CI 系统。
标签: ubuntu clang ubuntu-16.04 address-sanitizer