记忆/地址Sanitizer vs Valgrind

时间:2017-11-12 17:08:57

标签: valgrind address-sanitizer memory-sanitizer

我想要一些工具来诊断用户免费后的错误和未初始化的错误。我正在考虑Sanitizer(记忆和/或地址)和Valgrind。但我对它们的优点和缺点一无所知。谁能说出Sanitizer和Valgrind的主要特征,差异和优缺点?

编辑:我发现了一些比较:Valgrind使用DBI(动态二进制检测),Sanitizer使用CTI(编译时检测)。无论Sanitizer的运行速度比Valgrind(2x)快得多,Valgrind都能让程序慢得多(20倍)。如果有人能给我一些更重要的要点,那将是一个很大的帮助。

2 个答案:

答案 0 :(得分:22)

我想你会发现这个wiki很有用。

TLDR杀菌剂的主要优点是

  • 小得多的CPU开销(Lsan实际上是免费的,UBsan是1.25x,Asan和Msan对于计算密集型任务是2-4x,对于GUI是1.05-1.1x,Tsan是5-15x)
  • 更广泛的检测到的错误(堆栈和全局溢出,使用后返回)
  • 完全支持多线程应用程序(Valgrind支持多线程是一个笑话)

缺点是

  • 显着的内存开销(Asan最多2倍,Msan最多3倍,Tsan最多10倍),这可能是资源受限环境(例如电话)的限制因素;它仍然比Valgrind好。
  • 更复杂的集成(你需要教你的构建系统来理解Asan,有时解决Asan本身的限制/错误,你还需要使用相对较新的编译器)
  • MemorySanitizer目前还不能轻易使用,因为它需要重建Msan下的所有依赖项(包括所有标准库,例如libstdc ++);这意味着临时用户只能使用Valgrind来检测未初始化的错误
  • 清洁剂通常不能相互组合(唯一支持的组合是Asan + UBsan + Lsan),这意味着您必须单独进行QA运行以捕获所有类型的错误

答案 1 :(得分:0)

一大不同之处在于,包含LLVM的memorythread消毒剂隐式映射了大量地址空间(例如,在x86_64环境中跨TB的地址空间调用mmap(X, Y, 0, MAP_NORESERVE|MAP_ANONYMOUS|MAP_FIXED|MAP_PRIVATE, -1, 0) )。即使他们不一定分配该内存,映射也会在限制性环境(例如,对ulimit值进行合理设置的环境)中造成严重破坏。