94  
查询码:00000528
Linux 下的 Valgrind(内存调试)
作者: 盖杰 于 2020年06月30日 发布在分类 / 物联网组 下,并于 2020年06月30日 编辑
C++调试


valgrind内存检测中五种内存丢失的解释
结果示例:
LEAK SUMMARY:
definitely lost : 140 bytes in 5 blocks.
indirectly lost : 1,252 bytes in 41 blocks.
possibly lost : 0 bytes in 0 blocks.
still reachable : 36 bytes in 1 blocks.
suppressed : 0 bytes in 0 blocks.
1) still reachable : 表示泄漏的内存在程序运行完的时候,仍旧有指针指向它,因而,这种内存在程序运行结束之前可以释放。一般情况下valgrind不会报这种泄漏,除非使用了参数 --show-reachable=yes。
注意: 一般说来,为static指针变量或全局的指针变量(它们的生存期是全局的)进行内存分配,如果没有释放它,虽然这也是"not-freed   blocks",但是它是"reachable"的.现代的OS会得到这些指针并去释放它.   
2) definitely losg : 明确地已经泄漏了,因为在程序运行完的时候,没有指针指向它, 指向它的指针在程序中丢失了。一般这种泄漏常见,而且比较难发现问题所在。
3) indirectly lost : 间接地 ????????????????
4) possibly lost : 发现了一个指向某块内存中部的指针,而不是指向内存块头部。这种指针一般是原先指向内存块头部,后来移动到了内存块的中部,还有可能该指针和该内存根本就没有关系,检测工具只是怀疑有内存泄漏。
5) suppressed:

使用参数设置:
valgrind --leak-check=full --show-reachable=no –show-leak-kinds=all –track-origins=yes --log-file=文件名 ./a.out
--leak-check=full 指的是完全检查内存泄漏
--show-reachable=yes 是显示内存泄漏的地点
--trace-children=yes 是跟入子进程。

–log-file
指定报告输出文件

–track-origins=yes
是否显示未定义的变量,在堆、栈中被定义没有被initialised的变量都被定义成origins。默认是关闭这个option的。

–show-leak-kinds=all
这里可以支持的选项有[definite|possible],一般只需要去关注definite(绝逼),possible是可能会存在。

–leak-check=full
当服务器退出时是否收集输出内存泄漏,选项有[no|summary|full]这个地方我们将其设置成全输出,默认将会使用summary方式。


 推荐知识

 历史版本

修改日期 修改人 备注
2020-06-30 23:37:25[当前版本] 盖杰 C++基础v1.0

知识分享平台 -V 4.8.7 -wcp