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

时间:2014-06-10 16:01:11

标签: runtime-error clang llvm debug-symbols

使用-fsanitize=memory进行编译时,我在运行程序时得到WARNING: Trying to symbolize code, but external symbolizer is not initialized!。如何初始化外部符号化器?

4 个答案:

答案 0 :(得分:12)

我使用MSAN_SYMBOLIZER_PATH=$(which llvm-symbolizer-3.4) ./a.out解决了自己的问题。问题是Ubuntu后缀版本号,但二进制文件并不知道。当然,在使用内存清理程序时,您需要使用MSAN而不是ASAN

答案 1 :(得分:2)

您应该能够将ASAN_FILTER环境变量设置为指向符号器,但我无法使其工作。但是,您可以在事后将stderr重定向到符号化器。您仍会收到有关未初始化符号系统的警告,但文件名和行号将是正确的。

您可以使用asan_symbolizer.py作为外部符号。从该链接下载后(例如到/ tmp),像这样调用你的程序(对于这个例子,在bash中):

./myprogram 2>&1 | /tmp/asan_symbolize.py | c++filt 

答案 2 :(得分:0)

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

答案 3 :(得分:0)

在我的Ubuntu系统上,问题是LLVM的工具安装在/usr/bin下的版本后缀(如llvm-symbolizer-4.0),而清理工具正在寻找没有版本后缀的工具。

LLVM还会将其二进制文件安装到例如/usr/lib/llvm-4.0/bin; /usr/bin下的工具实际上只是符号链接。因此,一个简单的解决方案是在使用清理程序时将适当的/usr/lib/llvm-*/bin目录添加到您的路径中。