码迷,mamicode.com
首页 > 其他好文 > 详细

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

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

标签:style   blog   http   color   os   io   strong   for   

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

标签:style   blog   http   color   os   io   strong   for   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!