内存/地址消毒剂与 Valgrind

问题描述 投票:0回答:2

我想要一些工具来诊断释放后使用错误和未初始化错误。我正在考虑 Sanitizer(内存和/或地址)和 Valgrind。但我对它们的优点和缺点知之甚少。谁能告诉我 Sanitizer 和 Valgrind 的主要特点、区别和优缺点吗?

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

valgrind address-sanitizer memory-sanitizer
2个回答
59
投票

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

TLDR 消毒剂的主要优点是

  • CPU 开销更小(Lsan 实际上是免费的,UBsan/Isan 是 1.25 倍,Asan 和 Msan 是计算密集型任务的 2-4 倍,GUI 是 1.05-1.1 倍,Tsan 是 5-15 倍)
  • 更广泛的检测到的错误(堆栈和全局溢出、返回后使用/范围)
  • 完全支持多线程应用程序(Valgrind 对多线程的支持就是个笑话)
  • 内存开销小得多(Asan 高达 2 倍,Msan 高达 3 倍,Tsan 高达 10 倍,比 Valgrind 好得多)

缺点是

  • 更复杂的集成(您需要教您的构建系统理解Asan,有时需要解决Asan本身的限制/错误,您还需要使用相对较新的编译器)
  • MemorySanitizer 目前不太容易使用,因为它需要 重建 Msan 下的所有依赖项(包括所有标准库,例如 libc++);这意味着临时用户只能使用 Valgrind 来检测未初始化的错误
  • 消毒剂通常不能相互组合(唯一支持的组合是 Asan+UBsan+Lsan),这意味着您必须进行单独的 QA 运行来捕获所有类型的错误

4
投票

一个很大的区别是 LLVM 包含的 memorythread 清理程序隐式映射大片地址空间(例如,通过在 x86_64 环境中跨 TB 级地址空间调用

mmap(X, Y, 0, MAP_NORESERVE|MAP_ANONYMOUS|MAP_FIXED|MAP_PRIVATE, -1, 0)
)。尽管它们不一定分配该内存,但映射可能会对限制性环境造成严重破坏(例如,对
ulimit
值进行合理设置的环境)。

© www.soinside.com 2019 - 2024. All rights reserved.