您的位置: 飞扬精品软件园 >> 文章中心 >> 系统教程 >> Linux系统 >> 防止内存泄露 Linux下用Valgrind做检查

相关文章链接

最新新闻资讯

    防止内存泄露 Linux下用Valgrind做检查

    防止内存泄露 Linux下用Valgrind做检查


    • 阅览次数: 文章来源: 原文作者: 整理日期: 2010-07-12


    下面举两个用valgrind做内存检查的例子

      例子一 (test.c):

      #include <string.h>

      int main(int argc, char *argv[])

      {

      char *ptr;

      ptr = (char*) malloc(10);

      strcpy(ptr, "01234567890");

      return 0;

      }

      编译程序

      gcc -g -o test test.c

      用valgrind执行命令

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

      报告如下

      ==4270== Memcheck, a memory error detector.

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

      ==4270== Using LibVEX rev 1606, a library for dynamic binary translation.

      ==4270== Copyright (C) 2004-2006, and GNU GPL'd, by OpenWorks LLP.

      ==4270== Using valgrind-3.2.0, a dynamic binary instrumentation framework.

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

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

      ==4270==

      ==4270== Invalid write of size 1

      ==4270== at 0x4006190: strcpy (mc_replace_strmem.c:271)

      ==4270== by 0x80483DB: main (test.c:8)

      ==4270== Address 0x4023032 is 0 bytes after a block of size 10 alloc'd

      ==4270== at 0x40044F6: malloc (vg_replace_malloc.c:149)

      ==4270== by 0x80483C5: main (test.c:7)

      ==4270==

      ==4270== Invalid write of size 1

      ==4270== at 0x400619C: strcpy (mc_replace_strmem.c:271)

      ==4270== by 0x80483DB: main (test.c:8)

      ==4270== Address 0x4023033 is 1 bytes after a block of size 10 alloc'd

      ==4270== at 0x40044F6: malloc (vg_replace_malloc.c:149)

      ==4270== by 0x80483C5: main (test.c:7)

      ==4270==

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

      ==4270== malloc/free: in use at exit: 10 bytes in 1 blocks.

      ==4270== malloc/free: 1 allocs, 0 frees, 10 bytes allocated.

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

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

      ==4270== checked 51,496 bytes.

      ==4270==

      ==4270==

      ==4270== 10 bytes in 1 blocks are definitely lost in loss record 1 of 1

      ==4270== at 0x40044F6: malloc (vg_replace_malloc.c:149)

      ==4270== by 0x80483C5: main (test.c:7)

      ==4270==

      ==4270== LEAK SUMMARY:

      ==4270== definitely lost: 10 bytes in 1 blocks.

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

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

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

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

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

      从这份报告可以看出,进程号是4270,test.c的第8行写内存越界了,引起写内存越界的是strcpy函数,

      第7行泄漏了10个字节的内存,引起内存泄漏的是malloc函数。

      例子二(test2.c)

      #include <stdio.h>

      int foo(int x)

      {

      if (x < 0) {

      printf("%d ", x);

      }

      return 0;

      }

      int main(int argc, char *argv[])

      {

      int x;

      foo(x);

      return 0;

      }

      编译程序

      gcc -g -o test2 test2.c

      用valgrind做内存检查

      valgrind --tool=memcheck ./test2

      输出报告如下

      ==4285== Memcheck, a memory error detector.

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

      ==4285== Using LibVEX rev 1606, a library for dynamic binary translation.

      ==4285== Copyright (C) 2004-2006, and GNU GPL'd, by OpenWorks LLP.

      ==4285== Using valgrind-3.2.0, a dynamic binary instrumentation framework.

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

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

      ==4285==

      ==4285== Conditional jump or move depends on uninitialised value(s)

      ==4285== at 0x8048372: foo (test2.c:5)

      ==4285== by 0x80483B4: main (test2.c:16)

      ==4285==p p

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

      ==4285== malloc/free: in use at exit: 0 bytes in 0 blocks.

      ==4285== malloc/free: 0 allocs, 0 frees, 0 bytes allocated.

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

      ==4285== All heap blocks were freed -- no leaks are possible.

    [1] [2] [3]


查看所有评论

网友对防止内存泄露 Linux下用Valgrind做检查 的评论

网名:
主题:
内容:
验证码: