使用-fsanitize=memory
进行编译时,我在运行程序时得到WARNING: Trying to symbolize code, but external symbolizer is not initialized!
。如何初始化外部符号化器?
答案 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
目录添加到您的路径中。