为什么 ASAN_SYMBOLIZER_PATH 无法与版本修饰的二进制文件一起使用了

27
在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二进制文件。


对于其他遇到此问题的人,看起来这是由于编译器运行时 该更改 导致的。我已经联系审核人员,试图确定这种行为变化是否有意,或者这是一种退化。 - acm
2
修复此问题的最简单方法:sudo ln -s /usr/bin/llvm-symbolizer-3.8 /usr/bin/llvm-symbolizer - Eraden
1
@Eraden 当然可以,在我的开发环境中完全没问题,但这是针对一个无法更改 /usr/bin 的 CI 系统。 - acm
3个回答

22

原来在Ubuntu的LLVM打包中,可以从路径/usr/lib/llvm-3.x/bin获取未经装饰的llvm-symbolizer二进制文件,因此PATH=/usr/lib/llvm-3.x/bin:$PATH [COMMAND]就能解决问题。尽管如此,我仍然认为这种变化是编译器运行时的退步。


9

The following

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

同样适用于llvm-symbolizer-4.0

(来自@Eraden评论的复制)


0

我在将不必要的换行符写入ASAN_SYMBOLIZER_PATH环境变量时出现了错误。所以在将其写入环境变量之前,我使用strip()函数进行了修复。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接