如何让 Valgrind 不检测特定的共享对象?

How to get Valgrind to not instrument a specific shared object?

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

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

==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 年内情况发生了变化。

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

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

不,这是不可能的。当您在 Valgrind 下 运行 一个应用程序时,它不是 运行 在 OS 下本地运行,而是在虚拟环境中。

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

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

  • 测试应用程序的优化构建。但是,您将因此丢失行号信息。
  • 开启泄漏检测
  • 避免昂贵的选择,例如 trace-origins

消毒剂速度更快,也可以检测堆栈溢出,但代价是需要检测。