【发布时间】: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 似乎无法做到这一点:
- Is it possible to make valgrind ignore certain libraries? -- 2010,说这是不可能的。
- Can I make valgrind ignore glibc libraries? -- 2010,解决方案是禁用警告。
- Restricting Valgrind to a specific function -- 2011,说不可能。
- using valgrind at specific point while running program -- 2013,没有答案。
- Valgrind: disable conditional jump (or whole library) check -- 2013,解决方案是禁用警告。
...除非在过去 6 或 7 年内发生了变化。
我的问题是:有什么办法可以加快内存检查的速度吗?或者不检查程序某些部分的内存访问?
目前我看到的唯一解决方案是修改程序以直接从磁盘读取数据,但我宁愿测试我计划部署的实际程序。 :)
【问题讨论】:
-
查看 Clang Sanitizers(其中许多已被移植到 gcc)
-
是的,Valgrind 慢。 Mayby 研究一下 llvm 清理程序 - 例如地址清理程序、未定义行为清理程序等。有很多,它们比 Valgrind 更快并且(恕我直言)好多了。
-
确实,GCC 和 CLang 都支持
-fsanitize=address选项。而且效果很好。它仅检测您使用标志构建的代码,因此可以有选择地使用它。当然,没有办法检测您无法自己构建的代码,但这正是我所寻找的。 :)
标签: c++ linux-device-driver valgrind