【问题标题】:How to get Valgrind to not instrument a specific shared object?如何让 Valgrind 不检测特定的共享对象?
【发布时间】:2018-09-09 20:49:27
【问题描述】:

我正在使用专有库来导入数据,它使用 GPU (OpenGL) 来转换数据。 通过 Valgrind (memcheck) 运行我的程序会导致数据导入需要 8-12 小时(而不是几分之一秒)。我需要在一夜之间完成我的 Valgrind 会话(并让我的屏幕整晚都处于解锁状态,因为 GPU 的东西在屏幕锁定时会暂停)。这引起了很多挫败感。

我不确定这是否相关,但 Valgrind 在我的显卡驱动程序中显示了数千个越界读/写错误:

==10593== Invalid write of size 4
==10593==    at 0x9789746: ??? (in /usr/lib/x86_64-linux-gnu/dri/i965_dri.so)

(我知道怎么suppress those warnings)。

我一直无法找到任何有选择地检测代码或排除某些共享库被检测的方法。我记得大约 20 年前在 Windows 上使用过一个工具,它会跳过检测选定的二进制文件。 memcheck 似乎无法做到这一点:

...除非在过去 6 或 7 年内发生了变化。

我的问题是:有什么办法可以加快内存检查的速度吗?或者不检查程序某些部分的内存访问?

目前我看到的唯一解决方案是修改程序以直接从磁盘读取数据,但我宁愿测试我计划部署的实际程序。 :)

【问题讨论】:

  • 查看 Clang Sanitizers(其中许多已被移植到 gcc)
  • 是的,Valgrind 。 Mayby 研究一下 llvm 清理程序 - 例如地址清理程序、未定义行为清理程序等。有很多,它们比 Valgrind 更快并且(恕我直言)好多了。
  • 确实,GCC 和 CLang 都支持-fsanitize=address 选项。而且效果很好。它仅检测您使用标志构建的代码,因此可以有选择地使用它。当然,没有办法检测您无法自己构建的代码,但这正是我所寻找的。 :)

标签: c++ linux-device-driver valgrind


【解决方案1】:

不,这是不可能的。当您在 Valgrind 下运行应用程序时,它并不是在操作系统下本机运行,而是在虚拟环境中运行。

Callgrind 等一些工具具有控制仪器的选项。然而,即使关闭了仪器,被测应用程序仍然在 Valgrind 虚拟环境下运行。

您可以采取一些措施来降低速度

  • 测试应用程序的优化构建。但是,您会因此丢失行号信息。
  • 转向泄漏检测
  • 避免使用成本高昂的选项,例如跟踪源

清理程序速度更快,还可以检测堆栈溢出,但代价是需要检测。

【讨论】:

  • 谢谢。我将尝试关闭泄漏检测等。优化的构建我不希望改变任何东西,因为执行数据导入的库我没有自己编译,它已经优化了。这就是这种大幅放缓发生的地方。
  • 禁用跟踪源和泄漏检测确实可以显着加快执行速度,但是我调用外部库来获取数据的程序部分(在内部使用 OpenGL)仍然需要一个多小时而不是不到一秒钟。我一直在使用消毒剂而不是 valgrind。无论如何,我接受这个答案。非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-11
  • 2019-08-07
  • 2020-11-20
  • 2020-05-16
相关资源
最近更新 更多