admin管理员组文章数量:1567278
一. Memcheck 工具介绍
valgrind 工具集包括各种工具,每个工具分别调试代码中不同类型的 bug。其中,Memcheck 工具为定位内存泄露或内存溢出等内存方面的问题。
二. Memcheck 工具使用
下面来说明 Memcheck 工具定位代码中存在的内存泄露等内存相关问题。以下面代码为实例:
#include <stdio.h>
#include <stdlib.h>
void fun(void)
{
char *p = malloc(10*sizeof(char));
p[10] = 0; //问题1:堆块溢出
} //问题2:内存泄漏--p未释放
int main(int argc, char **argv)
{
fun() ;
return 0 ;
}
下来使用 Memcheck 工具检测上面代码中存在的内存泄露或溢出等内存方面的问题。操作如下:
首先,编译程序,即输入 gcc -g main.c -o main.out 命令(带 -g 选项为了Memcheck 工具定位内存问题时可以定位到 C/C++的具体的某行);
其次, 使用 Memcheck 工具排查内存 bug。输入命令:valgrind --leak-check=yes ./main.out
操作如下所示:
分析以上打印 Log 信息,如下:
程序访问非法地址的内存,无效写入,即堆溢出。在代码的第 7 行。
==3492== Invalid write of size 1
==3492== at 0x10916B: fun (main.c:7)
堆空间分配的情况如下:
==3492== HEAP SUMMARY:
==3492== in use at exit: 10 bytes in 1 blocks
==3492== total heap usage: 1 allocs, 0 frees, 10 bytes allocated
内存泄漏的 Log 信息,内存泄露问题出现在第 6 行,如下所示:
==3492== 10 bytes in 1 blocks are definitely lost in loss record 1 of 1
==3492== at 0x483C855: malloc (vg_replace_malloc.c:393)
==3492== by 0x10915E: fun (main.c:6)
==3492== by 0x109188: main (main.c:12)
有几种泄漏:其中有两个最重要的类别。分别是 definitely lost(肯定泄露) 与 possibly lost(可能已经泄露)。代码中内存泄露统计如下:
==3492== LEAK SUMMARY:
==3492== definitely lost: 10 bytes in 1 blocks
==3492== indirectly lost: 0 bytes in 0 blocks
==3492== possibly lost: 0 bytes in 0 blocks
==3492== still reachable: 0 bytes in 0 blocks
==3492== suppressed: 0 bytes in 0 blocks
可以看出,代码中存在 10 字节的内存泄露。
版权声明:本文标题:Linux下 valgrind 工具定位内存泄露的方法 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1725886575a1047077.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论