现在的位置: 首页 > 综合 > 正文

在Linux下编写C程序,怎么检查程序是否有内存泄漏?

2018年04月02日 ⁄ 综合 ⁄ 共 2474字 ⁄ 字号 评论关闭

From: http://bbs.chinaunix.net/thread-908769-1-1.html

如题。


-------------------------------


找到了!  http://www.valgrind.org/


同时附一个转自 http://blog.chinaunix.net/u/18381/showart.php?id=162015 的示例:


#include <stdlib.h>


void f(void)

{

   int* x = malloc(10 * sizeof(int));

   x[10] = 0;        // problem 1: heap block overrun

}                    // problem 2: memory leak -- x not freed


int main(void)

{

     f();

     return 0;

}


编译代码:  

gcc -Wall example.c -g -o example 


注意:gcc 的-g 选项让Valgrind调试输出时指出相应信息的代码所在的行号。


运行valgrind: 

valgrind --tool=memcheck --leak-check=yes ./example


valgrind的执行结果: 

==6742== Memcheck, a memory error detector for x86-linux.

==6742== Copyright (C) 2002-2004, and GNU GPL'd, by Julian Seward et al.

==6742== Using valgrind-2.2.0, a program supervision framework for x86-linux.

==6742== Copyright (C) 2000-2004, and GNU GPL'd, by Julian Seward et al.

==6742== For more details, rerun with: -v

==6742==

==6742== Invalid write of size 4

==6742==    at 0x8048384: f (example.c:6)

==6742==    by 0x80483AC: main (example.c:12)

==6742==  Address 0x1B908050 is 0 bytes after a block of size 40 alloc'd

==6742==    at 0x1B904984: malloc (vg_replace_malloc.c:131)

==6742==    by 0x8048377: f (example.c:5)

==6742==    by 0x80483AC: main (example.c:12)

==6742==

==6742== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 1)

==6742== malloc/free: in use at exit: 40 bytes in 1 blocks.

==6742== malloc/free: 1 allocs, 0 frees, 40 bytes allocated.

==6742== For counts of detected errors, rerun with: -v

==6742== searching for pointers to 1 not-freed blocks.

==6742== checked 1360800 bytes.

==6742==

==6742==

==6742== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1

==6742==    at 0x1B904984: malloc (vg_replace_malloc.c:131)

==6742==    by 0x8048377: f (example.c:5)

==6742==    by 0x80483AC: main (example.c:12)

==6742==

==6742== LEAK SUMMARY:

==6742==    definitely lost: 40 bytes in 1 blocks.

==6742==    possibly lost:   0 bytes in 0 blocks.

==6742==    still reachable: 0 bytes in 0 blocks.

==6742==         suppressed: 0 bytes in 0 blocks.

==6742== Reachable blocks (those to which a pointer was found) are not shown.

==6742== To see them, rerun with: --show-reachable=yes


上面的C程序存在两个错误:1. 数组下标越界;2. 分配的内存没有释放,存在内存泄露的问题。

对于错误1,看Valgrind的调试信息片断

==6742== Invalid write of size 4

==6742==    at 0x8048384: f (example.c:6)

==6742==    by 0x80483AC: main (example.c:12)

==6742==  Address 0x1B908050 is 0 bytes after a block of size 40 alloc'd

==6742==    at 0x1B904984: malloc (vg_replace_malloc.c:131)

==6742==    by 0x8048377: f (example.c:5)


对于错误2,看这个

==6742== malloc/free: 1 allocs, 0 frees, 40 bytes allocated.

......

==6742== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1

==6742==    at 0x1B904984: malloc (vg_replace_malloc.c:131)

==6742==    by 0x8048377: f (example.c:5)

==6742==    by 0x80483AC: main (example.c:12)

抱歉!评论已关闭.