Ubuntu 为什么ASAN_Symboler_路径不再适用于版本修饰的二进制文件

Ubuntu 为什么ASAN_Symboler_路径不再适用于版本修饰的二进制文件,ubuntu,clang,ubuntu-16.04,address-sanitizer,Ubuntu,Clang,Ubuntu 16.04,Address Sanitizer,在Ubuntu 14.10上,llvm-symboler程序安装为/usr/bin/llvm-symboler-3.5。通常,地址消毒器希望在PATH中找到名为llvm symboler的二进制文件。但是,作为一种解决方法,可以显式地设置ASAN\u symboler\u路径。因此,在环境中设置ASAN\u symbolr\u PATH=/usr/bin/llvm-symbolr-3.5将允许地址消毒器检测程序打印符号化错误 在Ubuntu 16.04上,llvm-symboler程序再次安装了

在Ubuntu 14.10上,
llvm-symboler
程序安装为
/usr/bin/llvm-symboler-3.5
。通常,地址消毒器希望在
PATH
中找到名为
llvm symboler
的二进制文件。但是,作为一种解决方法,可以显式地设置
ASAN\u symboler\u路径
。因此,在环境中设置
ASAN\u symbolr\u PATH=/usr/bin/llvm-symbolr-3.5
将允许地址消毒器检测程序打印符号化错误

在Ubuntu 16.04上,
llvm-symboler
程序再次安装了版本后缀,现在是
/usr/bin/llvm-symboler-3.8
。但是,
ASAN\u symboler\u路径
设置似乎不再起作用。当ASAN检测到错误时,在环境中运行设置了
ASAN\u symbolr\u PATH=/usr/bin/llvm-symbolr-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指出的Symboler程序绝对是一个已知的Symboler程序,它的末尾恰好有一个Ubuntu授权的版本标签


请注意,在这里调整
PATH
没有帮助,因为Ubuntu没有提供没有版本装饰的
llvm符号器
二进制文件。

事实证明,在Ubuntu的llvm包装上,可以从路径
/usr/lib/llvm-3.x/bin
获得未经修饰的
llvm符号器
二进制文件,因此,
PATH=/usr/lib/llvm-3.x/bin:$PATH[COMMAND]
起到了作用。尽管如此,我仍然认为这一变化是编译器的一种倒退

sudo ln -s /usr/bin/llvm-symbolizer-3.8 /usr/bin/llvm-symbolizer
也适用于
llvm-symboler-4.0


(从@Eraden comment复制)

当我意外地将一个不必要的换行符写入
ASAN\u symbolr\u路径
env var时,我出现了这个错误。因此,在将它写入环境变量之前,我用strip()函数修复了它。

对于遇到这个问题的任何人来说,这似乎是[编译器中的此更改][1]。我已通过ping检查尝试确定行为中的此更改是有意的,还是回归[1]:修复此问题的最简单方法:
sudo ln-s/usr/bin/llvm-symbolr-3.8/usr/bin/llvm-symbolr
@Eraden当然,这在我的开发设备上运行良好,但这适用于我无法更改/usr/bin的CI系统。