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

标签 c++ linux-device-driver valgrind

我正在使用专有库导入数据,它使用 GPU (OpenGL) 来转换数据。 通过 Valgrind (memcheck) 运行我的程序导致数据导入需要 8-12 小时(而不是几分之一秒)。我需要在一夜之间完成我的 Valgrind session (并让我的屏幕整夜解锁,因为 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 年内情况发生了变化。

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

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

最佳答案

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

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

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

  • 测试您的应用程序的优化版本。但是,您将因此丢失行号信息。
  • 开启泄漏检测
  • 避免成本高昂的选项,例如追踪来源

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

关于c++ - 如何让 Valgrind 不检测特定的共享对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49580737/

相关文章:

linux-kernel - remap_pfn_range如何将内核内存重新映射到用户空间?

linux - 如何找到Linux模块路径

c - 我们如何使用 C 程序检查传递给磁盘驱动程序的缓冲区是否扇区对齐?

c - 在C中使用calloc为char数组分配内存时如何避免 'possibly lost'内存

c - C 中带指针和结构的链表

c++ - C 字符串和删除 - 它们究竟是如何工作的?

c++ - 自动按下按钮?

c++ - 除非已经转义,否则如何替换所有出现的字符串或字符?

valgrind - FreeBSD 上 valgrind 的限制

c++ - C++ win32 中的 WM_COMMAND 捕捉按钮按下