我该如何初始化LLVM的外部符号化器?

12

使用-fsanitize=memory编译时,运行程序时会出现WARNING:尝试符号化代码,但未初始化外部符号化器!。如何初始化外部符号化器?

4个回答

14

我通过使用MSAN_SYMBOLIZER_PATH=$(which llvm-symbolizer-3.4) ./a.out解决了自己的问题。问题在于Ubuntu会添加版本号,但二进制文件并不知道。当使用内存消毒剂时,当然需要使用MSAN而不是ASAN


3
您应该能够设置ASAN_FILTER环境变量来指向符号化程序,但我无法使其正常工作。不过,您可以在事后将stderr重定向到符号化程序。您仍将收到有关未初始化符号化程序的警告,但文件名和行号将是正确的。
您可以使用asan_symbolizer.py作为外部符号化程序。从该链接下载它(例如,下载到/tmp目录中),然后像这样调用您的程序(在bash中,以此示例为例):
./myprogram 2>&1 | /tmp/asan_symbolize.py | c++filt 

1
在我的Ubuntu系统上,问题是LLVM的工具安装在/usr/bin下,带有版本后缀(如llvm-symbolizer-4.0),而Sanitizer工具在查找它们时没有版本后缀。LLVM还将其二进制文件安装到例如/usr/lib/llvm-4.0/bin;位于/usr/bin下的工具实际上只是符号链接。因此,一个简单的解决方案是在使用Sanitizer时将相应的/usr/lib/llvm-*/bin目录添加到您的路径中。

0
当我在没有安装clang的Linux机器上运行使用-fsanitize = address编译的程序调试版本时,我收到了这样的警告。在我从devtoolset安装了clang之后,问题消失了。

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