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)的使用