为什么ASAN_SYMBOLIZER_PATH不再适用于版本装饰的二进制文件

时间:2016-06-28 15:01:06

标签: ubuntu clang ubuntu-16.04 address-sanitizer

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

3 个答案:

答案 0 :(得分:17)

事实证明,在Ubuntu的LLVM打包上,可以从路径llvm-symbolizer获得未经修饰的/usr/lib/llvm-3.x/bin二进制文件,因此PATH=/usr/lib/llvm-3.x/bin:$PATH [COMMAND]可以解决问题。我仍然认为这个变化是compiler_rt的回归。

答案 1 :(得分:5)

以下

$ext = "extension.txt"
$a = ([IO.File]::ReadAllText($ext)) -split ','
$a

$list = dir * -include $a |  Select Directory,Fullname,Name,Length,CreationTime 
$list

也适用于-split ','

(复制自@Eraden评论)

答案 2 :(得分:0)

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