记忆/地址Sanitizer vs Valgrind

kay*_*yas 25 valgrind address-sanitizer memory-sanitizer

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

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

yug*_*ugr 30

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

TLDR消毒剂的主要优点是

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

缺点是

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

  • 请注意,valgrind正确支持多线程应用程序。但是,只有一个线程可以同时执行(如此有效,在valgrind下运行的应用程序的运行就像在单个内核上一样) (3认同)