27

在 Ubuntu 14.10 上,该llvm-symbolizer程序安装为/usr/bin/llvm-symbolizer-3.5. 通常,地址清理程序希望找到一个名为 的二进制llvm-symbolizer文件PATH。但是,作为一种解决方法,可以显式设置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.8set 的 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版本修饰的二进制文件。

4

3 回答 3

22

事实证明,在 Ubuntu 的 LLVM 包装上,可以llvm-symbolizer从 path 中获取未加修饰的二进制文件,这一技巧/usr/lib/llvm-3.x/bin也是如此。PATH=/usr/lib/llvm-3.x/bin:$PATH [COMMAND]我仍然认为这种变化是 compiler_rt 的回归。

于 2016-07-13T17:54:13.460 回答
9

以下

sudo ln -s /usr/bin/llvm-symbolizer-3.8 /usr/bin/llvm-symbolizer

也适用于llvm-symbolizer-4.0

(复制自@Eraden 评论)

于 2017-04-05T10:42:06.570 回答
0

当我不小心将一个不必要的换行符写入ASAN_SYMBOLIZER_PATHenv var 时,我遇到了这个错误。所以我在将它写入环境变量之前用 strip() 函数修复了它。

于 2021-01-25T11:53:05.623 回答