首页 > 其他 > 详细

【Valgrind】How to check memory leak and where it's in 10 mins

时间:2014-08-06 01:27:11      阅读:406      评论:0      收藏:0      [点我收藏+]

1. Install

sudo apt-get install valgrind

2. If memory leak

example code:

bubuko.com,布布扣
/* memleak.c */
#include <stdlib.h>
void* memleak(int n)
{
    void *p = malloc(n);
    return p;
}
memleak.c
bubuko.com,布布扣
/* main.c */
#include <stdio.h>
#include <stdlib.h>
void* memleak(int n);
int main()
{
     int i=0;
     void *p = NULL;
     for(i=0; i<10; i++)
     {
     p = memleak(100);
         printf("allocate memory address: %p\n", p);
     }
     return 0;
}
main.c

Use ‘valgrind ./exe_binary [cmdline]‘ to check if memory leak happens:

josh@josh-VirtualBox:~/test_memleak$ gcc main.c memleak.c -O1 -o main.x
josh@josh-VirtualBox:~/test_memleak$ valgrind ./main.x
==6726== Memcheck, a memory error detector
==6726== Copyright (C) 2002-2011, and GNU GPLd, by Julian Seward et al.
==6726== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==6726== Command: ./main.x
==6726==
allocate memory address: 0x51f2040
allocate memory address: 0x51f20f0
allocate memory address: 0x51f21a0
allocate memory address: 0x51f2250
allocate memory address: 0x51f2300
allocate memory address: 0x51f23b0
allocate memory address: 0x51f2460
allocate memory address: 0x51f2510
allocate memory address: 0x51f25c0
allocate memory address: 0x51f2670
==6726==
==6726== HEAP SUMMARY:
==6726==     in use at exit: 1,000 bytes in 10 blocks
==6726==   total heap usage: 10 allocs, 0 frees, 1,000 bytes allocated
==6726==
==6726== LEAK SUMMARY:
==6726==    definitely lost: 1,000 bytes in 10 blocks
==6726==    indirectly lost: 0 bytes in 0 blocks
==6726==      possibly lost: 0 bytes in 0 blocks
==6726==    still reachable: 0 bytes in 0 blocks
==6726==         suppressed: 0 bytes in 0 blocks
==6726== Rerun with --leak-check=full to see details of leaked memory
==6726==
==6726== For counts of detected and suppressed errors, rerun with: -v
==6726== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)
 

3. Where memory leak

$ gcc main.c memleak.c -O1 -g -o main.x 

$ valgrind --leak-check=full ./main.x

ATTENTION:

  • "-O1" to prevent from inline functions by optimization, "-g" to get line number of memory leak functions.
  • In one word, use "DEBUG" flavour instead of "release" while finding memleak.
josh@josh-VirtualBox:~/test_memleak$ valgrind --leak-check=full ./main.x
josh@josh-VirtualBox:~/test_memleak$ valgrind --leak-check=full ./x
==7209== Memcheck, a memory error detector
==7209== Copyright (C) 2002-2011, and GNU GPLd, by Julian Seward et al.
==7209== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==7209== Command: ./x
==7209==
allocate memory address: 0x51f2040
allocate memory address: 0x51f20f0
allocate memory address: 0x51f21a0
allocate memory address: 0x51f2250
allocate memory address: 0x51f2300
allocate memory address: 0x51f23b0
allocate memory address: 0x51f2460
allocate memory address: 0x51f2510
allocate memory address: 0x51f25c0
allocate memory address: 0x51f2670
==7209==
==7209== HEAP SUMMARY:
==7209==     in use at exit: 1,000 bytes in 10 blocks
==7209==   total heap usage: 10 allocs, 0 frees, 1,000 bytes allocated
==7209==
==7209== 1,000 bytes in 10 blocks are definitely lost in loss record 1 of 1
==7209==    at 0x4C2B6CD: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==7209==    by 0x4005A3: memleak (memleak.c:5)
==7209==    by 0x400573: main (main.c:12)
==7209==
==7209== LEAK SUMMARY:
==7209==    definitely lost: 1,000 bytes in 10 blocks
==7209==    indirectly lost: 0 bytes in 0 blocks
==7209==      possibly lost: 0 bytes in 0 blocks
==7209==    still reachable: 0 bytes in 0 blocks
==7209==         suppressed: 0 bytes in 0 blocks
==7209==
==7209== For counts of detected and suppressed errors, rerun with: -v
==7209== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 2 from 2)
josh@josh-VirtualBox:~/test_memleak$
 

You can see the call stack, which means where memory leak happens

main() ==> memleak() ==> malloc()

4. Find memory leak because of invoking 3rd-party library

Use the same method as above.

【Valgrind】How to check memory leak and where it's in 10 mins,布布扣,bubuko.com

【Valgrind】How to check memory leak and where it's in 10 mins

原文:http://www.cnblogs.com/xjsxjtu/p/3893351.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!