Valgrind OpenCV

Posted

技术标签:

【中文标题】Valgrind OpenCV【英文标题】: 【发布时间】:2017-02-02 15:39:17 【问题描述】:

这是我的测试程序:

#include "opencv2/videoio.hpp"

int main(int argc, char** argv) 
    cv::VideoCapture videoCapture(argv[1]);
    cv::Mat frame;
    videoCapture.read(frame);
    return 0;

我这样运行这个程序:

valgrind --leak-check=yes ./GyroRecord ./walks6/w63/39840012.avi > valgrind_output 2>&1

这样整个输出就保存在valgrind_output文件中了。

valgrind_output的内容可以查看here。

但是,如果将来链接失效,这是摘要:

==9677== LEAK SUMMARY:
==9677==    definitely lost: 0 bytes in 0 blocks
==9677==    indirectly lost: 0 bytes in 0 blocks
==9677==      possibly lost: 1,352 bytes in 18 blocks
==9677==    still reachable: 166,408 bytes in 1,296 blocks
==9677==                       of which reachable via heuristic:
==9677==                         newarray           : 1,536 bytes in 16 blocks
==9677==         suppressed: 0 bytes in 0 blocks
==9677== Reachable blocks (those to which a pointer was found) are not shown.
==9677== To see them, rerun with: --leak-check=full --show-leak-kinds=all
==9677== 
==9677== For counts of detected and suppressed errors, rerun with: -v
==9677== ERROR SUMMARY: 18 errors from 18 contexts (suppressed: 0 from 0)

我想将“可能丢失”的字节数减少到 0。这可能吗?还是在使用 OpenCV 时我总是会有一些“可能丢失”的字节?

【问题讨论】:

查看文档,析构函数应该释放内存,我认为对于泄漏的库您无能为力。正如 valgrind 提供的那样,您可以添加 --leak-check=full --show-leak-kinds=all 并使用 -g 编译以尝试查看泄漏发生的位置。 您的日志中充满了仍然可以访问的项目(主要来自g_type_register_fundamental())。如果你抑制这些,你可能会看到树林中的树林。 它似乎是一个类似于这个问题的 Glib 错误:***.com/questions/16659781/…。 【参考方案1】:

OpenCV 带有用于valgrind抑制 文件(扩展名为.supp),可用于隐藏有关已分配资源的消息(通常在程序执行的早期),这些资源将被一直分配到程序终止并且操作系统必须清理混乱为止。

抑制文件放在/usr/share/OpenCV(在我的系统上):

例子:

valgrind --leak-check=yes --suppressions=/usr/share/OpenCV/valgrind.supp --suppressions=/usr/share/OpenCV/valgrind_3rdparty.supp ./GyroRecord ./walks6/w63/39840012.avi

OpenCV 项目上运行 valgrind 时,使用这些对我有很大帮助。

【讨论】:

参数是--suppressions 而不是--suppression。如需参考,请参阅Section 2.5。此外,还可以在opencv/platforms/scripts/ 找到抑制文件。 @AlexBailo 哦,谢谢,我更新了。我没有一个系统来对自己进行测试。 valgrind 在想要执行的程序之后 是否仍然采用抑制参数?我记得当我使用valgrind 时,这让我很困惑。 这个对我有用valgrind --leak-check=yes --suppressions=/usr/share/OpenCV/valgrind.supp --suppressions=/usr/share/OpenCV/valgrind_3rdparty.supp ./GyroRecord ./walks6/w63/39840012.avi @AlexBailo 这是个好消息。我更新了答案以反映这一点。再次感谢!

以上是关于Valgrind OpenCV的主要内容,如果未能解决你的问题,请参考以下文章

开发工具Valgrind内存问题检测工具(valgrind)的使用

开发工具Valgrind内存问题检测工具(valgrind)的使用

开发工具Valgrind内存问题检测工具(valgrind)的使用

内存调试工具---valgrind

Valgrind错误在操作系统中有所不同

内存泄漏分析valgrind