Valgrind 内存分析器结果

Posted

技术标签:

【中文标题】Valgrind 内存分析器结果【英文标题】:Valgrind Memory Analyzer results 【发布时间】:2015-06-18 07:47:09 【问题描述】:

我是第一次使用 Valgrind Analyzer。

我的程序很长,所以我不能发布代码。问题是我在运行程序时遇到分段错误,但不一致。我有一个循环,当我运行它进行少量迭代时,程序完成而没有错误。当我尝试更多迭代时,可能会根据循环的数量在不同的地方出现分段错误。我在 ubuntu 14.04 的 qt creator 3.0.1 中编写我的代码。该程序是用c++编写的,还使用了一些opencv库。

当我运行 Valgrind 内存分析器时,我得到了这个输出,但无法真正找出问题所在。分析器也以引用“**未知错误**”结束

Invalid write of size 4 in main in /home/esigalas/qt-workspace/builds/New-Train-SVM-build/main Address 0xffed6e770 is on thread 1's stack
1: main in /home/esigalas/qt-workspace/builds/New-Train-SVM-build/main

Invalid write of size 2 in main in /home/esigalas/qt-workspace/builds/New-Train-SVM-build/main
1: main in /home/esigalas/qt-workspace/builds/New-Train-SVM-build/main

Address 0x30c40d74 is 20 bytes after a block of size 3,392 alloc'd
1: malloc in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so
2: cv::fastMalloc(unsigned long) in /usr/local/lib/libopencv_core.so.2.4.9
3: cv::Mat::create(int, int const*, int) in /usr/local/lib/libopencv_core.so.2.4.9
4: cv::_OutputArray::create(int, int, int, int, bool, int) const in /usr/local/lib/libopencv_core.so.2.4.9
5: cv::Mat::copyTo(cv::_OutputArray const&) const in /usr/local/lib/libopencv_core.so.2.4.9
6: main in /home/esigalas/qt-workspace/builds/New-Train-SVM-build/main

【问题讨论】:

进行调试构建并再次运行 Valgrind,然后您将获得有关问题所在的文件名和行号信息。还可以在调试器中运行以捕获崩溃,并查看它们在代码中的位置。带有额外警告的构建,来自编译器的警告通常表明您做错了,这可能导致未定义的行为(您可能有)。还要检查所有指针,并确保在使用它们之前正确初始化它们,在需要时分配内存,不要使用已经释放的内存。 哦,每当您分配 anything 或尝试获取 any 资源时,请确保它确实成功了。 Valgrind 并没有做得更好,感谢他们帮助我解决问题的指针提示。 【参考方案1】:

这是一个很难回答的问题,因为您没有提供源代码。是否可以粘贴 New-Train-SVM-build/main 的源代码?

在任何情况下,调试由内存泄漏引起的分段错误的例程是删除所有您怀疑导致分段错误的代码并运行程序,直到您确定不再存在内存泄漏。例如,使用 linux 命令 top 检查内存大小是否增加,当您绝对确定程序中没有内存泄漏时,您开始以最少的步骤添加代码并运行程序,直到找到问题的确切原因。

【讨论】:

感谢有关删除垃圾代码以查看问题所在的提示,帮助我找到了解决方案。

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

Qt Creator Valgrind内存分析前端(分析Nginx内存)

Linux下利用Valgrind工具进行内存泄露检测和性能分析

C/C++内存检测工具Valgrind

如何创建内存转储和分析内存泄漏?

linux下内存泄露检测工具Valgrind

守护进程的内存分析